博主
258
258
258
258
专辑

java垃圾回收

阿王 2022-09-14 03:47:02 4568 0 0 0

B1、Java的垃圾回收

1.何为垃圾:
Heap中不再被引用的对象( Object )
while(true) { new StudentO; }
2.基本原理:
移除不再被使用的对象( Object )
3.基本假设:
大多数对象的生命周期都很短
4.两行代码:
System.gc0;
java.lang.OutOfMemoryError

B2、GC的3个方法

(1)Mark
从heap的根节点开始遍历整个heap ,标记还"活着”的Object
(2)Delete/Sweep
删除heap中的Object
(3)Compating
碎片整理

B3、分带收集器


B4、何时进入Old Generation?

(1)Survivor空间不够 |
(2)-XX:Max Tenuring Threshold存储空间4 bit (二进制1111)(+进制15)

B5、Old G eneration何时GC?

(1)快满时执行Major GC
(2)|mark/ sweep/ compacting整个heap (成本高)

B6、Java垃圾收集器

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内存使用切成小块)
高效且低延迟

B7、如何让JVM使用某种垃圾收集器

  • XX: +UseSerialGC
    -XX: +UseParallelGC: Young generation设置为parallel, Old generation设置
    为单线程的GC
    -XX:+UseParallelOldGC Young generation和Old generation都用parallel
    -XX: + UseParNewGC:只对Young generation设置Parallel
    -XX:+UseConcMarkSweepGC: Old Generation设置为concurrent. Young
    generation设置为ParNewGC
  • XX:+ UseG1GC
    1.6 Parallel, 1.7 update4 G1

B8、对JVM的Heap大小进行调整

-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)

B9、如何打印GC log

-verbose:gc
-XX:+ PrintGCDetails
-Xloggc:gc.log