JVM学习(三)
直接内存
- 系统内存
- 常用于NIO操作
- 分配回收成本较高,读写性能高
- 不受JVM内存回收管理
Direct buffer memory
- Unsafe类
垃圾回收
- 引用计数法 --引用次数为0的对象可以回收。 存在循环引用。(Python)
- 可达性分析法 ,肯定不能回收的对象 -> 根对象(GC Root对象)。扫描整堆内存中的所有对象,判断每个对象是否被根对象直接或间接引用。
- Memory Analyzer 分析堆的工具
- GC Root :System Class(java.lang.Class) ; 操作系统引用的java对象; 被加锁的对象; 活动线程中使用的对象(包括虚拟机栈中栈帧内引用的对象)。
四种引用
- 强引用(eg int[] n = new int[2])
- 软引用 垃圾回收并且内存不够
- 弱引用 垃圾回收是会被回收
- 软引用和弱引用也是对象,其所引用的对象被回收后,如果它在创建时分配了引用队列,它会进入引用队列。
- 虚引用(一定分配了引用队列) eg.Cleaner Cleaner虚引用对象引用ByteBuffer, ByteBuffer 回收后,Cleaner进入引用队列,reference handler线程检查是否有新入队的Cleaner,有则调用clean方法。
- 终结器引用(一定分配了引用队列) 不推荐使用
垃圾回收算法
- 标记清除 快、容易产生内存碎片
- 标记整理 没有内存碎片 慢
- 复制算法
标记 -》 from区存活的对象放入to区,交换from区和to区
分代回收
- Minor GC 新生代清理
- Full GC 新生代和老年代整个清理