赞
踩
本篇内容包括:Jvm 性能调优简介;根据需求目标进行 Jvm 调优规划(即 调优的目标、调优的步骤);Jvm 调优参数、命令、工具;以及 Java 中的内存泄露问题的详解…
到目前为止,我们已经对 Jvm 进行了简单的了解,知道了 Jvm 运行时各种各样的内存结构,各种垃圾回收机制以及各种对应的垃圾收集器及其配置。而我们整个 Jvm 系列的最终目标不当仅仅以了解基础理论为终点,理论总应作为实践的工具。接下来,我们开始了解 Java 性能优化的最后一环:Jvm 性能调优。
我们常说的 Jvm 性能调优实际上有着三个以及的目的:
而这一性能调优基本的步骤就是明确优化目标、发现性能瓶颈、性能调优、通过监控及数据统计工具获得数据、确认是否达到目标。或者笼统的概括为 以业务场景开始压力测试监控,查看调优结果 两步。
首先我们要明白 Jvm 性能调优的形式方案并不是固定的,不同的应用有着不同的目标与不同的问题。而根据需求进行 Jvm 规划和预调优最先要明确的就是调优的目标。
下面是 Jvm 常提到的性能指标
其中 吞吐量、响应时间、内存占用 三条是 GC 的矛盾之处, 如果要使工作线程的吞吐量提高, 就必须使工作线程的暂停时间降低,那么垃圾收集的时间必然就跟着降低,那内存占用就也会提高,高吞吐量这会让应用程序的用户感觉只有应用程序线程在做 “生产性” 工作。 所以直觉上,吞吐量越高程序运行越快。
低暂停时间是 从用户的角度来看不管是 GC 还是其他原因导致一个工作线程被挂起始终是不好的。特别是对于一个交互式应用程序。
所以,在设计(或使用)GC 算法时,我们必须确定我们的目标:一个GC算法只可能针对两个目标之一(即只专注于最大吞吐量和最小合理暂停时间),或尝试找到一个二者的折衷
如何进行调优,下面是调优常用的步骤:
-Xms2g
初始化推大小为 2g
-Xmx2g
堆最大内存为 2g
-XX:NewRatio=4
设置年轻的和老年代的内存比例为 1:4
-XX:SurvivorRatio=8
设置新生代 Eden 和 Survivor 比例为 8:2
–XX:+UseParNewGC
指定使用 ParNew + Serial Old 垃圾回收器组合
-XX:+UseParallelOldGC
指定使用 ParNew + ParNew Old 垃圾回收器组合
-XX:+UseConcMarkSweepGC
指定使用 CMS + Serial Old 垃圾回收器组合
-XX:+PrintGC
开启打印gc信息
-XX:+PrintGCDetails
打印 gc 详细信息
借助 GCViewer 日志分析工具,可以非常直观地分析出待调优点。可从以下几方面来分析:
Memory,分析 Totalheap、Tenuredheap、Youngheap 内存占用率及其他指标,理论上内存占用率越小越好;
Pause,分析 Gc pause、Fullgc pause、Total pause 三个大项中各指标,理论上 GC 次数越少越好,GC 时长越小越好;
内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着。
在 Java 中,内存泄漏
就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为 Java 中的内存泄漏,这些对象不会被 GC 所回收,然而它却占用内存。
内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你 Out of memory。
Java 内存泄漏的几种情况:
避免内存泄漏的方法
try…finally
结构,在 finally 中关闭 Statement 对象和连接。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。