码迷,mamicode.com
首页 > 编程语言 > 详细

java垃圾回收GC

时间:2019-04-10 21:43:38      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:原理   失败   虚拟机   随机   老年   回收   code   新生代   不可   

垃圾回收时,暂停虚拟机运行

基础假设:大部分对象只存在很短的时间

对于新生代,Minor GC经常会发生
Major/Full GC会对老生代做GC
老生代GC采用Compact算法,移动形成完整的空余区

垃圾回收在什么时候发生?
如果内存满了,内存分配失败时运行;调用system.gc()时运行。

对什么对象进行回收?
从根节点出发,对不可达对象进行回收。

  • 垃圾回收根节点
    • 局部变量
    • 静态变量
    • Native方法引用的对象
    • 活动线程,等待中的Monitor(wait、notify、synchronized)

点击查看GC原理

技术图片

技术图片

新生代:使用复制算法
老年代:使用标记 - 清理 或者 标记 - 整理 算法

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友好代码

  1. 当使用Array-based的数据结构(ArrayList,HashMap等)时,尽量减少resize。比如new ArrayList时,尽量估算size,在创建时指定size,减少size可以避免没必要的array copying、gc碎片等问题
  2. 如果一个List只需要顺序访问,不需要随机访问,用LinkedList代替ArrayList,其本质是链表,不需要resize,但只适用于顺序访问。

技术图片

java垃圾回收GC

标签:原理   失败   虚拟机   随机   老年   回收   code   新生代   不可   

原文地址:https://www.cnblogs.com/xiaobingzi/p/10686094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!