Java Performance - 优化和分析Garbage Collection/垃圾收集
随着硬件的不断提升,Java Heap 越来越大,合理的垃圾收集调优变得愈发重要。下面介绍一些最佳实践:
注意:
- 下面不涉及 IBM AIX Java. 同时不介绍原理,仅仅是建议以及初始配置/最佳实践,后续如何迭代优化
- 需要理解 The Java Virtual Machine Specification > Run-Time Data Areas 和 Memory Management Whitepaper
- 配置合适的堆内存大小
- 通过配置 -Xms -Xmx 设定,分别表示初始和最大值
- 可以是 4G, 8G, 12G, 16G, 甚至 24G 等等
- 关于 YOUNG 和 OLD 默认 1:2 的比例 ( -XX:NewRatio ),不太建议一开始就调整,后续结合 GC 检查
- 垃圾收集优化建议
- 配置 -XX:+DisableExplicitGC
- 很多代码里面会有 System.gc() 的调用来触发垃圾收集,带来不必要的负担;该配置会忽略该 API 调用。
- 选择 GC Policy
- Java 7 建议默认 - 多线程并行垃圾收集不管 YONG/OLD,线程数是 CPU 个数
- Java 6 - 默认 YOUNG 多线程并运行,OLD 单线程。建议配置 OLD 多线程并行配置 -XX:+UseParallelOldGC
- 线程数通过 -XX:ParallelGCThreads 配置,建议值是 CPU 个数除以 JVM 个数
- 其它 GC 策略
- Java 6 的 -XX:+UseConcMarkSweepGC,不太建议因为 Java 7 淘汰了; 有 BUG;同时有一个阶段还是会暂停 JVM ,并且特别久 - 6G 的堆可能要几十秒
- Java 7 以来的 G1 - 没实践过,任何的 GC BUG 都是致命的。
- 配置 -XX:+DisableExplicitGC
- 监控 GC 状况
- 通过配置 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:<path>/gc.log 打印 GC 详细日志
- 分析 GC 频率
- 分析 GC 前后内存情况
- 分析 GC user, sys, real 耗时
- 比如 - 下面就明确反映操作系统 BUG,在并行 GC 情况下,大约应该是 user / GC线程数 = real
[GC [PSYoungGen: 6144000K->423839K(7168000K)] 6455356K->735195K(15360000K), 182.4565520 secs] [Times: user=1.71 sys=1454.44, real=182.43 secs]
--YOUNG GC,共 7168000K 大小,收集前用了 6144000K, 后用了 423839K,共耗时 182.4565520 sec
[GC [PSYoungGen: 629652K->413103K(7168000K)] 941009K->724459K(15360000K), 116.7165380 secs] [Times: user=1.25 sys=932.20, real=116.70 secs]
--YOUNG GC,user=1.25 (GC CPU 耗时) sys=932.20 (OS 耗时), real=116.70 secs (总耗时)
[Full GC [PSYoungGen: 367256K->0K(7495680K)] [ParOldGen: 429715K->699671K(8192000K)] 796972K->699671K(15687680K) [PSPermGen: 126393K->126390K(2097152K)], 558.1420070 secs] [Times: user=2.77 sys=4458.28, real=558.06 secs]
--FULL GC
Java Performance - 优化和分析Garbage Collection/垃圾收集的更多相关文章
- Java Garbage Collection/垃圾收集 策略查看
Java 的垃圾收集有各种各样的策略,默认的策略也会经常的改变. --比如到底是 serial , parallel, CMS; 具体到 Minor 怎么样,Old 又怎么样? 命令 java -XX ...
- garbage collection - 垃圾收集
Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected la ...
- garbage collection - 垃圾收集 生命周期 跟踪内存使用
Professional.JavaScript.for.Web.Developers.3rd.Edition.Jan.2012 JavaScript is a garbage-collected la ...
- Java Garbage Collection Basics--转载
原文地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Overview Purpose ...
- hive impala C++ Java垃圾回收 Garbage Collection GC
hive impala impala 推荐每个节点内存 2^7~2^8GB Impala与Hive的比较 - 文章 - 伯乐在线 http://blog.jobbole.com/43233/ &l ...
- How Garbage Collection Really Works
Java Memory Management, with its built-in garbage collection, is one of the language's finest achiev ...
- [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)
source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...
- JVM垃圾收集(Java Garbage Collection / Java GC)
JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
随机推荐
- NYOJ(21),BFS,三个水杯
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=21 BFS判环,vis标记状态即可. #include <stdio.h> # ...
- C#中求数组的子数组之和的最大值
<编程之美>183页,问题2.14——求子数组的字数组之和的最大值.(整数数组) 我开始以为可以从数组中随意抽调元素组成子数组,于是就有了一种想法,把最大的元素抽出来,判断是大于0还是小于 ...
- 2016年12月6日 星期二 --出埃及记 Exodus 21:1
2016年12月6日 星期二 --出埃及记 Exodus 21:1 "These are the laws you are to set before them:你在百姓面前所要立的典章是这 ...
- 命令行下运行php的方法和技巧
linux中直接用"php"命令来执行php文件 一般在linux命令行下运行php文件的代码: XML/HTML代码 linux下执行:#php安装路径 -f php文件路径 例 ...
- shell 条件判断参数
-b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目录,则为真 -e file 若文件存在,则为真 -f ...
- Struts2应用的开发流程
Struts2的开发流程 为了能够在eclipse中使用Struts2在进行开发时,需要根据需要导入一些有关的jar包: 在官网下载相关的压缩包,这里下载了两个:struts-2.3.30-all.z ...
- 如何通过Button获取UITableViewCell
发现一个奇怪的问题: 手机(ios7) 2015-06-17 15:11:29.323 ***[1412:60b] [btn superview] = UITableViewCellContent ...
- Cheatsheet: 2013 10.01 ~ 10.08
Other 20 Tips for becoming a better programmer Top 10 Movies for Programmers .NET RaptorDB - The Key ...
- Linux常见问题的处理方法(长期更新)
一.使用sudo命令时xxx is not in the sudoers file. This incident will be reported. 1.su -,输入root的密码完成身份切换. 2 ...
- [Effective Java]第四章 类和接口
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...