内存如果溢出,通过自动内存管理机制实现,垃圾回收是不可控的,但是可以降低回收的频率。
自动内存管理机制的实现原理 —避免内存溢出1
申请内存过程
- 计算要创建对象所需要占用的内存大小
- 在内存中找一块儿连续并且是空闲的内存空间,标记为已占用;
- 把申请的内存地址绑定到对象的引用上,这时候对象就可以使用了。
垃圾回收过程— 标记、清除两阶段
标记阶段
:从 GC Root 开始,你可以简单地把 GC Root 理解为程序入口的那个对象,标记所有可达的对象,因为程序中所有在用的对象一定都会被这个 GC Root 对象直接或者间接引用。
清除阶段
:遍历所有对象,找出所有没有标记的对象。这些没有标记的对象都是可以被回收的,清除这些对象,释放对应的内存即可。内存释放后进行内存碎片整理,将不连续空闲的内存移动到一起
注意 :标记和清除过程中,必须把进程全部暂停,否则计算的结果就是不准确的,进程暂定可能会在造成程序卡死。
垃圾回收什么时候被触发?
用户请求服务,程序运行创建对象,程序结束,或内存不足,触发垃圾回收机制,开始清理对象。
高并发程序为什么会卡死?
高并发短时间内创建海量对象,迅速沾满内存,内存空间短缺,被迫启动垃圾回收机制,垃圾回收导致进程长时间暂停,长时间暂停进而导致大量请求积压,即使垃圾回收结束,此时又来了大量请求,频繁启动垃圾回收机制,恶性循环,内存溢出
高并发管理技巧 — 低垃圾回收频率
- 优化代码中处理请求的业务逻辑,尽量少产生一次性对象,和占用内存较大的对象
- 考虑内存占用比较大的对象是否可以反复重用且可以自行回收(创建对象池,用的时候取,不用的时候在放回去)