JVMGCOOM知多少?

Posted 彼岸飞翔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVMGCOOM知多少?相关的知识,希望对你有一定的参考价值。


JVM


Java Virtual Machine(Java虚拟机),GC就是Java垃圾回收机制,主流的JVM(HotSpot)采用分代收集算法,新生代采用复制算法回收,老年代采用标记-整理算法回收。Java采用的是类似树形结构的可达性分析法来判断对象是否还存在引用。即从GC roots开始,把所有可以搜索得到的对象标记为存活对象。


JVM的内存空间包含:

程序计数器:线程私有,是一块较小的内存,是当前线程所执行的字节码的行号指示器,是Java虚拟机规范中唯一没有规定OOM(OutOfMemoryError)的区域

Java栈:线程私有,生命周期和线程相同。为每一个执行方法创建一个栈帧,用于存储局部变量和操作数(对象引用)。

Java堆:所有线程共享,虚拟机启动时创建。存放对象实例和数组,所占内存最大。分为新生代(Minor)、老年代(Major)。新生代分Eden区,Survivor区,Survivor区又分为From space 区和To space区。Eden区和Survivor区的内存比为8:1:1,当扩展内存大于可用内存,抛出OOM。老年代用于存放经过多次Minor GC 之后依然存活的对象。

方法区:所有线程共享。用于存储已被虚拟机加载的类的信息,常量,静态变量等数据。又称为非堆(Non-Heap),又称“永久代”。GC很少在这个区域进行,但不代表不会回收。这个区域回收目标主要是针对常量池的回收和对类型的卸载。内存不足抛出OOM。

本地方法栈:线程私有。与Java栈类似,但,不是为Java方法服务,是Native方法区,也会抛出StackOverFlowError和OOM。


GC机制


Minor GC:指从新生代空间回收内存,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC 非常频繁,一般回收速度比较快。执行Minor GC操作时,一般不会影响到永久代。所有的 Minor GC 都会触发“全世界的暂停(stop-the-world)”,停止应用程序的线程,不过这个过程非常短暂。

Major GC / Full GC:指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的 Minor GC(但非绝对的,ParallelScavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程) 。MajorGC 的速度一般会比 Minor GC 慢 10倍以上。

Minor GC 触发条件:当新生代满时就会触发Minor GC ,年轻代指的是Eden区满,Survivor区满不会引发GC。

Full GC 触发条件:

(1)调用System.gc时,系统建议执行Full GC,但是不必然执行

(2)老年代空间不足

(3)方法区空间不足

4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存

5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小


可达性分析算法


在进行可达性分析算法,如果对象在进行可达性分析后发现没有与GC Roots 相连接的引用链(从GC Roots’ 的对象作为起始点,所走过的路径称为引用链),那他将会被第一次标记并且进行一次筛选,筛选条件是此对象是否有必要执行 finalize() 方法(该方法只会被系统自动调用一次)。当对象没有覆盖finalize() 方法,或者 finalize() 方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”,即意味着可直接回收。

如果这个对象被判定为有必要执行 finalize() 方法,那么这个对象就会放置在一个叫做 F-Queue 的队列中,并在稍后由一个由虚拟机自动建立的、低优先级的Finalizer 线程去执行它。这里所谓的“执行”是指虚拟机会出发这个方法,并不承诺或等待他运行结束。finalize() 方法是对象逃脱死亡命运的最后一次机会,稍后 GC 将对 F-Queue 中的对象进行第二次小规模的标记,如果对象要在 finalize() 中成功拯救自己,只要重新与引用链上的任何一个对象简历关联即可。

虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在Eden出生,当GC线程启动时,会通过可达性分析法,经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,Eden区和From Space区的存活对象复制到To Space区,然后把Eden 区和From Space区的对象释放掉,将被移动到Survivor区的对象年龄设为 1。GC轮循扫描To Space区,对象在To Space区中每熬过一次Minor GC,年龄就增加1,当它的年龄增加到一定程度(默认为15)时,就把依然存活的对象复制到老年代中。对象晋升老年代的年龄阈值,可以通过参数-XX:MaxTenuringThreshold 来设置。


以上是关于JVMGCOOM知多少?的主要内容,如果未能解决你的问题,请参考以下文章

iOS-TextField知多少

网页制作知多少

性能测试知多少---并发用户

oracle hint 知多少

oracle hint 知多少

UITextField知多少