知其然、知其所以然!
内存分配与回收策略-深入理解垃圾回收器
学习垃圾回收的意义
Java与C++等语言最大的技术区别:自动化的垃圾回收机制(GC:Garbage Collection)
为什么要了解GC和内存分配策略
1、面试需要
2、GC对应用的性能是有影响的;
3、写代码有好处
栈:栈中的生命周期是跟随线程,所以一般不需要关注
堆:堆中的对象是垃圾回收的重点
方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点
简化说明:谁需要GC?
栈 = 不需要 ,凡是共享的对象
堆:重点、方法区 / 元空间 (也有)
GC案例
自动回收机制也有失败的时候(Oom类)
-Xms 堆区内存初始内存分配的大小
-Xmx 堆区内存可被分配的最大上限
-XX:+PrintGCDetails 打印GC详情
-XX:+HeapDumpOnOutOfMemoryError
VM 参数:-Xms30m -Xmx30m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
当堆内存空间溢出时输出堆的内存快照
新生代配置
新生代大小配置参数的优先级:
中间 -Xmn 限定大小
-XX:SurvivorRatio
2个Survivor区和Eden区的比值
8 表示 两个Survivor : Eden = 2 : 8 ,每个Survivor占 1/10
可以修改为2
8 表示 两个Survivor : Eden = 2 : 2 ,各占一半
GC overhead limit exceeded 超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常
1. 垃圾回收会占据资源
2. 回收效率过低也会有限制
为什么new出的对象不会被回收了,我们来看看GC是如何判断对象的存活