1.何为垃圾:
Heap中不再被引用的对象( Object )
while(true) { new StudentO; }
2.基本原理:
移除不再被使用的对象( Object )
3.基本假设:
大多数对象的生命周期都很短
4.两行代码:
System.gc0;
java.lang.OutOfMemoryError
(1)Mark
从heap的根节点开始遍历整个heap ,标记还"活着”的Object
(2)Delete/Sweep
删除heap中的Object
(3)Compating
碎片整理
(1)Survivor空间不够 |
(2)-XX:Max Tenuring Threshold存储空间4 bit (二进制1111)(+进制15)
(1)快满时执行Major GC
(2)|mark/ sweep/ compacting整个heap (成本高)
1.1、Serial Collector
最基础的一种收集器,单线程,适用于非常基础的应用场景
1.2、Concurrent Collector (CMS)( oncurrent Mark Sweep)
应用程序运行时在后台同时运行的一种收集器,不是等待Old Generation即将满了的时候才进
行数据收集,而是在后台同时进行。只在mark/ re -mark的时候stop-the-world"
1.3、Concurrent Collector的应用场景
足够的内存
足够的CPU资源(因为需要提供系统资源给个常驻后 台并不停 做清理的线程)
较小延迟需求
2.1、Parallel Collector (并行收集器)
使用CPU多核资源、多线程去处理mark/ sweep等操作。仅当heap快满了时才触发, “stop-the-world”
2.2、Parallel Collector的应用场景
内存有限
CPU资源有限
app需要更高的吞吐量并能接受延迟
3.1、G1 (Garbage- 1st)
把heap切成小的区块放到内存中
每一个区块可能被划分为Eden space, survivor space或old space
-当某个区块出现较多垃圾时,该区块会被GC
3.2、 G1 (Garbage- 1st)
G1即是Concurrent的,又是parallel的
Parallel:因为会在某区块快满时进行GC ,且处理多个区块时CPU会用到多个内核
Concurrent:只会停掉某-区块 ,不会stop-the-world
更好的利用了heap资源(之前的垃圾收集器都是一整块 , G1内存使用切成小块)
高效且低延迟
-Xmsvalue (设置heap的最小值)
-Xmxvalue (设置heap的最大值) (default:256M)
-XX:NewRatio =ratio (设置为2: Young generation: old generation = 1:2;
1/3的内存资源分给Young generation; 2/3的内存资源分给Old generation)
-XX:NewSize=size:设置Eden space大小
- XX:MaxNewSize =size:设置Eden space最大值
- XX:PermSize:设置Permgen大小(method data/ static obet…)
-XX:MaxPermSize:设置Permgen最大值(def: 64M)
-verbose:gc
-XX:+ PrintGCDetails
-Xloggc:gc.log