文档介绍:JVM内存问题最佳实践JVM Best Practice
曾凡光
2010年03月
JVM内存问题最佳实践
本次技术交流,涵盖范围为:
如何选择合适的Java虚拟机
了解Java基本内存管理基本概念
了解发生内存不足/内存泄漏错误的原因和症状
了解如何诊断内存不足/内存泄漏错误
了解如何解决内存不足/内存泄漏错误
3
MENU
选择合适的Java虚拟机
Java内存管理的基本概念
GC次数过多消耗时间过长的原因和症状
内存不足和内存泄漏错误的原因和症状
诊断、定位和解决内存不足和内存泄漏错误
使用分析工具解决内存不足和内存泄漏错误
预防内存不足和内存泄漏
OutOfMemory错误实例
4
Java虚拟机的种类
Oracle Java虚拟机
原Sun Java虚拟机
原BEA JRockit
两种Java虚拟机,都运行在Windows、Linux、Solaris平台
HP Java虚拟机:
与SUN JDK基本兼容,有自己独特的启动参数
运行在HP UNIX上
IBM Java虚拟机:
与Sun JDK基本兼容
启动参数的写法风格与Sun JDK、HP JDK非常不同
主要用于WebSphere、跑在AIX上的中间件服务器
开源 Java虚拟机:
与SUN JDK兼容
5
如何选择合适的Java虚拟机
选择稳定的JDK:
刚刚GA的版本不稳定,
刚增加新特性的版本不稳定,
安装JDK之前,先看厂商的Release Notes
根据平台和应用,选择合适厂商的JDK:
HP-UX只能选择HP JDK,AIX只能选择IBM JDK
Windows、Linux可以选择SUN JDK和JRockit
Solaris平台,最好使用SUN JDK
开源JDK,目前生产环境中用的极少
6
Java虚拟机 32 VS 64
尽量选择使用32位JDK:
32位JDK在TPS测试中,结果比64位JDK要好;JDK ,64位略微领先32位JDK
主要适用于内存需求较小,CPU密集型应用
64位JDK主要用于大内存应用:
突破4G内存限制
吞吐量并没有提高
主要用于大内存需求的系统
尽量启用指针压缩技术
IBM: -Xcompressedrefs
SUN:-d64 -XX:+pressedOops
BEA:-pressedRefs=true
7
小节回顾
Java虚拟机的种类
如何选择合适的Java虚拟机
32bit VS 64bit
在本小节中,我们讲述了以下内容:
8
MENU
选择合适的Java虚拟机
Java内存管理的基本概念
GC次数过多消耗时间过长的原因和症状
内存不足和内存泄漏错误的原因和症状
诊断、定位和解决内存不足和内存泄漏错误
使用分析工具解决内存不足和内存泄漏错误
预防内存不足和内存泄漏
OutOfMemory错误实例
9
Java内存管理的基本概念
Java内存
Java 堆内存(heap)
Permanent区(Sun/Hp JDK)
Java 堆内存(heap):
是 JVM 用于分配 Java 对象的内存,包含活动对象和不可用对象
堆大小通常是在服务器启动时使用 java 命令中的–Xms(最小) –Xmx(最大)标志来定义。
Permanent区:
是Sun JDK和HP JDK用来加载类(class)的专门的内存区
这个区域不归属Java 堆内存(heap)范围
如果Java应用很大,例如类(class)很多,那么建议增大这个区域的大小来满足加载这些类的内存需求
通过–XX:PermSize=***M –XX:MaxPermSize=***M调整
10
Java内存管理的基本概念
本地内存(native memory):
是 JVM 用于其内部操作的本地内存(非Java内存)
JNI 代码和第三方本地模块(例如,本地 JDBC 驱动程序)也使用本地内存
最大本地内存大小取决于以下因素:
操作系统进程内存大小限制
已经指定用于 Java 堆的内存
进程内存大小:
32位操作系统,理论最大值2的32次方=4G
64位操作系统下使用64位的JDK,按照现在的硬件条件,可以看做无限制
进程内存=
Java 内存+ 本地内存
+ 加载的可执行文件和库+ 操作系统保留内存