JVM堆的理解

在JVM中,咱们常常提到的就是堆了,堆确实很重要,其实,除了堆以外,还有几个重要的模块,看下图:java

 

大 多数状况下,咱们并不须要关心JVM的底层,可是若是了解它的话,对于咱们系统调优是很是有用的,在这里面了解JVM的GC原理,是很是重要的一块知识。 咱们都知道对于一个大型网站,若是JVM频繁发生FULL GC,那么将会是致命的危险,不只仅会形成网站响应迟钝,更严重的时候会致使系统崩溃,这对用户体验来说,都是咱们不肯意看到的。安全

在JVM里的内存空间,从大的层面划分,主要有新生代空间(Young)和老年代空间(Old),其中Young空间,又被分为2个部分和3个板块,分别是1个Egen区,和2个Survivor区,看下图:网站

 

OK,下面来具体看下,每部分都是干啥的编码

(1)Eden区域是用来存放使用new或者newInstance等方式建立的对象,默认都是存放在Eden区,除非这个对象太大,或者超过了设定的阈值-XX:PretenureSizeThresold,这样的对象会被直接分配到Old区域。线程

(2)2个Survivor(幸存)区,通常称S0,S1,理论上他们是同样大的,解释一下,他们是如何工做的:对象

在不断建立对象的过程当中,Eden区会满,这时候会开始作Young G也叫Minor GC,而Young空间的第一次GC就是找出Eden区中,幸存活着的对象,而后将这些对象,放到S0,或S1区中的其中一个, 假设第一次选择了S0,它会逐步将活着的对象拷贝到S0区域,可是若是S0区域满了,剩下活着的对象只能放old区域了,接下来要作的是,将Eden区域 清空,此时时候S1区域也是空的。blog

当第二次Eden区域满的时候,就将Eden区域中活着的对象+S0区域中活着的对象,迁移到S1中,若是S1放不下,就会将剩下的部门,放到Old区域中,只是此次对象来源区域增长了S0,最后会将Eden区+S0区域,清空内存

第三次和第四次依次类推,始终保证S0和S1有一个是空的,用来存储临时对象,用于交换空间的目的,反反复复屡次没有被淘汰的对象,将会放入old区域中,默认是15次。具体的交换过程就和上图中的信息类似。it

问题一:怎么定义活着的对象?io

从根引用开始,对象的内部属性可能也是引用,只要能级联到的都被认为是活着的对象

问题二:什么是根?

本地变量引用,操做数栈引用,PC寄存器,本地方法栈引用等这些都是根。

问题三:对象进入Old区域有什么坏处?

old区域通常称为老年代,老年代与新生代不同,年轻代,咱们能够认为存活下来的对象不多,而老年代则相反,存活下来的对象不少,因此JVM的 堆内存,才是咱们一般关注的主战场,由于这里面活着的对象很是多,因此发生一次FULL GC,来找出来全部存活的对象是很是耗时的,所以,咱们应该尽可能避免FULL GC的发生。

问题四:S0和S1通常多大,靠什么参数来控制,有什么变化?

通常来讲很小,咱们大概知道它与Young差很少相差一倍的比例,设置的的参数主要有两个:

-XX:SurvivorRatio=8

-XX:InitialSurvivorRatio=8

第一个参数是Eden和Survivor区域比重,注意是一个Survivor的的大小,若是将其设置为8,则说明Eden区是一个Survivor区的8倍,换句话说S0或S1空间是整个Young空间的1/10,剩余的80%由Eden区域来使用。

第二个参数是Young/S0的比值,当其设置为8时,表示s0或s1占整个Young空间的12.5%。

问题五;一个对象每次Minor Gc时,活着的对象都会在s0和s1区域转移,通过通过Minor GC多少次后,会进入Old区域呢?

默认是15次,参数设置-XX:MaxTenuringThreshold=15,计数器会在对象的头部记录它交换的次数

问题六:为何发生FULL GC会带来很大的危害?

在发生FULL GC的时候,意味着JVM会安全的暂停全部正在执行的线程(Stop The World),来回收内存空间,在这个时间段内,全部除了回收垃圾的线程外,其余有关JAVA的程序,代码都会静止,反映到系统上,就会出现系统响应大幅度变慢,卡机等状态。

举个通俗易懂点的例子,就是在一个房间里,若是有一我的,不停的扔垃圾,而后有一个清洁工不停扫垃圾,这时候,咱们的系统是OK的,由于基本不会 出现垃圾堆满房间的情景,并且由于清洁工能够对付过来,假设如今有10我的不停扔垃圾,那么就房间就会很快被堆满,这时候清洁工,因为工做不过来了,大声 吼一声,大家都暂停3分钟,别再扔了,我先把这个房间打扫完,大家才能够扔。

在这个场景中,一我的扔,一我的扫,就相似于Minor GC,这时候,并不会影响扔垃圾的人,而后一旦10我的同时仍,并且很快就没地方仍了,这时候,就会触发Full GC,而后JVM下令,大家暂时都别仍了,等我何时回收完垃圾了,大家在仍,如今你们清楚了吧,所谓的10我的,就是相似咱们成千上百的java类, 在不停的执行任务,所谓的清洁工,就是咱们的GC机制,因此,你们在平时编码的时候,必定注意尽可能少造点垃圾对象,这样触发FULL GC的概率,才会变小。

相关文章
相关标签/搜索