深入理解JVM(三)

深入理解JVM(三)

第3章 垃圾收集器与内存分配策略

Java和C++之间有一堵内存动态分配和垃圾回收的高墙,墙外面的人想进来,墙里面的人却想出来。

1.判断对象是否死亡

a)引用计数法(c++中smart pointer & python)
有人引用我,我就还有价值不会被GC,直到计数为0,我就真的完蛋了。(CoCo中的RememberMe)

存在死循环BUG,A和B之间相互引用搞小团体。

b)可达性分析(Java & C#)
设定一个GC Root Set,一路继承的引用链,如果你碰不到这个Root,你就可能被GC。

Java中 GC Root可以为:
1.虚拟机栈引用的对象
2.方法区中静态属性引用的对象
3.方法区中常量引用的对象
4.JNI的Native方法引用的对象

2.Java中引用的类型

a)强引用 Strong Reference

最常见的new。只要引用还存在,GC永远不会回收掉被引用的对象。

b)软引用 Soft Reference

有用但非必需的对象。在内存溢出报异常之前,会把他们当牺牲品送去火葬场,如果内存还是不够才会报异常。

c)弱引用 Weak Reference
同样非必需的对象。只要JVM要GC,这部分就一定会挂,不管内存够不够。
d)虚引用 Weak Reference
幽灵引用。存在的唯一价值就是能在这个对象被GC时候收到一个系统的通知。

3.其实方法区(HotSpot中的永久代)也有GC,主要回收废弃常量和无用的类。

4.GC算法

a)标记-清除 Mark-Sweep(老年代常用)
b)复制 Copy(新生代常用)
c)标记-整理 MArk-Compact

5.HotSpot虚拟机的垃圾收集器

image

a)Serial 收集器
简单 & 高效,Client模式下的虚拟机常用
b)CMS 收集器
以最短回收停顿时间为目标,JDK1.5时期最佳,能应对并发性,但是对CPU资源敏感,无法处理浮动垃圾。
c)G1 收集器
JDK1.7时期最佳,能做多核,可预测停顿,分代收集,空间整理。思想大致就是利用多次打标签。

6.内存分配和回收策略

a)对象优先在Eden分配
b)大对象直接进入老年代
c)长期存活的对象将进入老年代

空间分配担保:老年代腾空内存给新生代做内存贷款。

猜你喜欢

转载自blog.csdn.net/u014744127/article/details/80266682