垃圾回收时,暂停虚拟机运行
基础假设:大部分对象只存在很短的时间
对于新生代,Minor GC经常会发生
Major/Full GC会对老生代做GC
老生代GC采用Compact算法,移动形成完整的空余区
垃圾回收在什么时候发生?
如果内存满了,内存分配失败时运行;调用system.gc()时运行。
对什么对象进行回收?
从根节点出发,对不可达对象进行回收。
- 垃圾回收根节点
- 局部变量
- 静态变量
- Native方法引用的对象
- 活动线程,等待中的Monitor(wait、notify、synchronized)
新生代:使用复制算法
老年代:使用标记 - 清理 或者 标记 - 整理 算法
JVM调优 |
-三大性能调优参数
-xms,最小堆内存
-xmx,最大堆内存,一般设置为与xms一样,避免出现内存抖动
-xss,是对每个线程栈的调优参数,影响堆栈调用的深度
避免Eden过大(From/To,频繁GC)或过小(频繁YoungGC),建议Eden:From:To=8:1:1,即默认值。-XX:SurvivorRatio
合理设置新生代存活周期,默认值15。
避免新生代设置过小(频繁YoungGC;大对象,From/To不足->FullGC),过大(新生代变大,YoungGC更耗时;旧生代变小,频繁FullGC),建议新生代:Heap=33%,即Young:Old=1:2。
编写GC友好代码
- 当使用Array-based的数据结构(ArrayList,HashMap等)时,尽量减少resize。比如new ArrayList时,尽量估算size,在创建时指定size,减少size可以避免没必要的array copying、gc碎片等问题
- 如果一个List只需要顺序访问,不需要随机访问,用LinkedList代替ArrayList,其本质是链表,不需要resize,但只适用于顺序访问。
原文地址:https://www.cnblogs.com/xiaobingzi/p/10686094.html
时间: 2024-10-11 11:02:14