安卓Java高级

GC原理与调优

2019-03-22  本文已影响13人  逍遥天扬

GC原理与调优

GC主要就是在JAVA堆中进行的。

Java 的内存管理实际上就是对象的管理,其中包括对象的分配和释放,对于程序员来说,分配对象使用new关键字;释放对象时,只要将对象所有引用赋值为null,让程序不能够再访问到这个对象,我们称该对象为"不可达的".GC将负责回收所有"不可达"对象的内存空间。

GC算法

GC算法.

GC收集器

回收器 概述 年轻代 老年代
串行回收器(serial collector) 客户端模式的默认回收器,所谓的串行,指的就是单线程回收,回收时将会暂停所有应用线程的执行 X serial old回收器标记-清除-合并。标记所有存活对象,从头遍历堆,清除所有死亡对象,最后把存活对象移动到堆的前端,堆的后端就空了
并行回收器 服务器模式的默认回收器,利用多个线程进行垃圾回收,充分利用CPU,回收期间暂停所有应用线程 Parallel Scavenge回收器,关注可控制的吞吐量(吞吐量=代码运行时间/(代码运行时间加垃圾回收时间)。吞吐量越大,垃圾回收时间越短,可以充分利用CPU。但是 parrellel old回收器,多线程,同样采取“标记-清除-合并”。特点是“吞吐量优先”
CMS回收器 停顿时间最短,分为以下步骤:1初始标记;2并发标记;3重新标记;4并发清除。优点是停顿时间短,并发回收,缺点是无法处理浮动垃圾,而且会导致空间碎片产生 X 适用
G1回收器 新技术,将堆内存划分为多个等大的区域,按照每个区域进行回收。工作过程是1初始标记;2并发标记;3最终标记;4筛选回收。特点是并行并发,分代收集,不会导致空间碎片,也可以由编程者自主确定停顿时间上限 适用 适用

针对GC的建议

根据GC的工作原理,我们可以通过一些窍门技巧和方式,让GC运行更加有效率,更加符合应用程序的要求。以下就是一些程序设计的几点建议:

OutOfMemoryError

OutOfMemoryError是内存溢出, 有多种情况会出现内存溢出:

GC优化需要考虑的JVM参数

类型 参数 描述
堆内存大小 -Xms 启动JVM时堆内存的大小
-Xmx 堆内存最大限制
新生代空间大小 -XX:NewRatio 新生代和老年代的内存比
-XX:NewSize 新生代内存大小
-XX:SurvivorRatio Eden区和Survivor区的内存比

GC优化时最常用的参数是-Xms,-Xmx和-XX:NewRatio。-Xms和-Xmx参数通常是必须的,所以NewRatio的值将对GC性能产生重要的影响。

有些人可能会问如何设置永久代内存大小,你可以用-XX:PermSize和-XX:MaxPermSize参数来进行设置,但是要记住,只有当出现OutOfMemoryError错误时你才需要去设置永久代内存。

GC调优方法:
jstat使用

上一篇 下一篇

猜你喜欢

热点阅读