1.运行时数据结构
2.堆分代
3.垃圾收集器
- Parallel Scavenge收集器:新生代称为PSYoungGen,老年代称为ParOldGen,永久代称为Metaspace
- ParNew收集器:新生代为ParNew
- Serial收集器:新生代为DefNew
4.gc日志
package jvm; public class GcTest { public static void main(String[] args) { System.out.println("垃圾回收前........"); System.gc(); System.out.println("垃圾回收后........"); } }
控制台:
垃圾回收前........ [GC (System.gc()) [PSYoungGen: 1996K->816K(38400K)] 1996K->824K(125952K), 0.0010917 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (System.gc()) [PSYoungGen: 816K->0K(38400K)] [ParOldGen: 8K->526K(87552K)] 824K->526K(125952K), [Metaspace: 2594K->2594K(1056768K)], 0.0072251 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 垃圾回收后........ Heap PSYoungGen total 38400K, used 998K [0x00000000d5d00000, 0x00000000d8780000, 0x0000000100000000) eden space 33280K, 3% used [0x00000000d5d00000,0x00000000d5df9b20,0x00000000d7d80000) from space 5120K, 0% used [0x00000000d7d80000,0x00000000d7d80000,0x00000000d8280000) to space 5120K, 0% used [0x00000000d8280000,0x00000000d8280000,0x00000000d8780000) ParOldGen total 87552K, used 526K [0x0000000081600000, 0x0000000086b80000, 0x00000000d5d00000) object space 87552K, 0% used [0x0000000081600000,0x0000000081683a30,0x0000000086b80000) Metaspace used 2600K, capacity 4486K, committed 4864K, reserved 1056768K class space used 288K, capacity 386K, committed 512K, reserved 1048576K
4.判断对象是否可回收
(1)引用计数法
package jvm; /** * 引用计数法: * 循环引用无法回收 */ public class ReferenceCountgorithms { public Object instance; public static void main(String[] args) { ReferenceCountgorithms m1 = new ReferenceCountgorithms(); ReferenceCountgorithms m2 = new ReferenceCountgorithms(); m1.instance = m2; m2.instance = m1; m1 = null; m2 = null; System.gc(); } }
(2)可达性分析法
5.垃圾收集算法
(1)标记-清除算法
(2)复制算法
主要针对新生代
(3)标记-整理-清除算法
主要针对老年代
(4)分代算法
6.垃圾收集器
(1)serial
单线程垃圾收集器
(2)ParNew