JVM内存分配与回收

2021-02-17  本文已影响0人  传达室马大爷

1、堆的概念

堆(heap):Java中的堆是JVM管理的最大的一块内存空间,主要用于存放各种类的实例对象

clipboard.png

2、对象进入老年代的场景

大对象就是需要连续存储空间的对象(-XX:PretenureSizeThreshold 可以设置大对象的大小),如果对象的大小超过这个设定的空间,那么该对象会直接进入老年代,不会进入年轻代。这个参数只在Serial和ParNew两个收集器下有效。

作用:为了避免大对象在Eden区和两个Survivior区发生大量的内存复制,JVM默认PretenureSizeThreshold值为0,意味着任何对象都会在新生代创建

-XX:PretenureSizeThreshold=1000000 -XX:+UseSerialGC

虚拟机采取分代收集的思想来管理内存,对象在Eden区出生并经历过第一次Minor GC后仍然能够存活并且可以被Survivor区容纳的话,将对象移动到Survivor区空间后,该对象的年龄为1。对象在Survivor区每熬过一次Minor GC则年龄会+1,当年龄大小等于最大年龄时(默认为15岁,-XX:MaxTenuringThreshold设置),则会被晋升到老年代。

-XX:MaxTenuringThreshold=10

当前存放和对象的某一个Survivor区的所有对象,如果对象的大小总和大于Survivor区内存大小的50%,那么大于等于这批对象年龄最大值的对象全部进入老年代。比如Survivor区有一批对象,年龄1+年龄2+年龄3+年龄n的多个年龄对象大小综合大于Survivor区内存大小的50%,那么年龄>=n的对象全部进入老年代

作用:希望那些长期存活的对象尽早的进入老年代,对象动态年龄判断机制一般在Minor GC之后触发

3、触发Minor GC的条件

大量对象分配到了Eden区,当Eden区存满时触发一次Minor GC,可能99%的对象会被垃圾回收,剩下存活的地方会被移动到Survivor区的From区,再下一次Eden区存满的时候,会再一次触发Minor GC,将Eden区和From区存活的对方移动到Survivor区的To区,依次循环。

4、触发Full GC的场景

clipboard.png

5、判断对象可回收方法

弊端:循环引用的对象无法被回收,不被使用

GC Roots根节点有:线程栈的局部变量、静态变量、成员变量、本地方法栈的变量等

6、方法区判断一个类是否可回收条件

7、垃圾收集算法

优点:效率高

缺点:空间问题,标记清除后产生大量的不连续的内存碎片

clipboard.png clipboard.png clipboard.png
上一篇 下一篇

猜你喜欢

热点阅读