`

jvm调优

 
阅读更多

 

1.       方法区又叫永久区,里面放的是.class文件的信息、静态变量、字符串常量、常量池等信息。单词以perm开头

2.       我们能优化的部分是堆内存。

3.       还有堆内存、栈内存。我们能优化的地方是堆内存。

4.       Java内存结构图: 堆内存是在java内存结构中占的比例比较大的

 

5.       一个线程对应一个栈,一个方法对应一个栈针

6.       下面我们来看堆内存

 

7.       堆内存分为两大块,即新生代和老年代。新生代又分三个, survivor(色外我):幸存者的意思,被垃圾回收之后还幸运的存活下来了。Eden(一电):伊甸园

8.       在我们new对象的时候,会把特别大的对方放在老年代中,其他的对象放在新生代。

9.       垃圾回收过程:经过一次GC(垃圾回收)后,假如某个对象1还有指针在引用它,那么这个对象1就会从eden内存跑到survivor1内存中。现在第二次GC,此时对象1survivor1跑到survivor2中,同时第二次GC没有被回收的对象也被放在survivor2中。此时survivor1内存中是空的了。现在开始第三次GC,会把survivor2中的对象放到survivor1中,并把eden内存中没有被回收的对象也放到survivor1中。此时survivor2内存又空了。依次这样迭代下去。survivor1survivor2的角色是互换的。

10.   总结一下:

   .edensurvivor1survivor2都是内存区域

   . survivor1survivor2的角色其实是来回互换的。即from—>totoàfrom

11.   上面我们介绍了垃圾是如果被回收的,那么问题来了,GC的时候是如何确定这个对象是垃圾的。

12.   垃圾:①没有被引用的对象是垃圾。②两个对象互相引用,但是除了彼此引用之外没有其他引用,这就是一对垃圾。

13.   强引用:我们平时new的对象,我们平时用的都是强引用。

14.   软引用、弱引用、虚引用

15.   如何确定垃圾:

   引用计数。但是这种办法会有循环引用的问题(多个对象互相引用)

   正向可达:从roots(根)对象开始计算,可以到达的对象都不是垃圾,其他的都是垃圾。

 

16.   垃圾回收算法:现在已经确定什么是垃圾了,就开始回收了。

   标记清除法:

我们通过正向可达,可以找出哪些不是垃圾。图中三种颜色,也已经标明哪些是存活的对象,哪些是回收的对象了。绿色的地方表示内存是空的。

标记清除的缺点:内存不连续了。假如我现在来了个特别大的对象的时候,可能会发现没有位置了。此时就会发生full gc(大型回收)

 

   复制算法

定义:把内存分成两部分,上半部分和下半部分各占两行。先用上半部分。在垃圾回收的时候通过正向可达,可以找出存活下面的对象。灰色表示垃圾回收的时候存活下来的对象。存活下面的对象会复制到下面两行当中,此时是连续的了。

第二次产生新对象的时候,会放入下半部分。当第二次垃圾回收的时候,又会把下半部分存活下来的对象在放在上半部分中。最终的效果就是在上下部分来回互换。

复制算法的缺点:复制算法解决了标记清除算法的缺点,但是复制算法也有缺点,缺点就是浪费内存。假如堆内存是4G,那么我们只能有2G能用。

注意:新生代中的survivor1survivor2之间,他们两个之间用的是复制算法传递对象。特点:占用的内存空间不是很大,效率也高。

 

   标记压缩

定义:把存活下来的对象都压缩到一起,这种效率比复制算法稍微低一点。这个算法是用在老年代中的。特点就是垃圾少。老年代的对象可能很久都不会被垃圾回收。

 

17.   总结这个过程:我们的对象创建后都是在堆内存中的,堆内存中包含新生代老年代等,新生代与老年代的内存比例是1:3,但是可以调整。一个对象如果特别大,创建之后就直接进入老年代这个内存中(我们可以设置对象的大小,当对象大于某个值的时候就进入老年代)。如果对象不是很大就进入eden内存中。经过一次gc垃圾回收之后,95%左右的对象都会被回收掉。我们把没有被回收的(即:5%的部分)对象放到survivor1Edensurvivor1: survivor2=8:1:1

 

第二:jvm的参数

1.       Jvm的参数有三种,如下图:

 

第三:java对象的分配

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics