文档介绍:曹春联动北方科技中间件技术支持
JVM 内存管理机制分析与OOM问题浅析
用心联动世界品质源于专业
400-810-2327
主讲内容如下
400-810-2327
了解Java基本内存管理基本概念
了解Jvm参数的参数配置及其作用
了解发生内存不足/内存泄露错误的主要原因
如何诊断内存不足/内存泄露
使用分析工具分析内存不足和内存泄露
OOM错误实例
了解Java基本内存管理基本概念
400-810-2327
Java内存包括哪几部分?
Java 堆内存(Heap)
Permanent区(Sun/Hp JDK)
本地内存(Native Memory)
Java 堆内存(Heap):
是 JVM 用于分配 Java 对象的内存,包含活动对象和freed对象
堆大小使用 java 命令中的–Xms(最小) –Xmx(最大)标志来定义。
Permanent区:
是Sun JDK和HP JDK用来加载类(class)的专门的内存区
这个区域不归属Java 堆内存(Heap)范围
如果Java应用很大,例如类(class)很多,那么建议增大这个区域的大小来满足加载这些类的内存需求
通过–XX:PermSize=***M –XX:MaxPermSize=***M调整
了解Java基本内存管理基本概念
400-810-2327
本地内存(Native Memory)
是 JVM 用于其内部操作的本地内存(非Java内存)
JNI 代码和第三方本地模块(例如,本地 JDBC 驱动程序)也使用本地内存
最大本地内存大小取决于以下因素:
操作系统进程内存大小限制
已经指定用于 Java 堆的内存
进程的内存大小等于什么?
32位操作系统,理论最大值2的32次方=4G
64位操作系统,理论最大值是一个很大的数字
进程内存= Java (Heap)+本地内存+ 加载的可执行文件和库+ 操作系统保留内存
了解Java基本内存管理基本概念
400-810-2327
Java堆内存大小的决定因素:
进程大小限制,例如:<=4G
“加载的可执行文件和库+系统保留内存”不同操作系统和应用不一样, 通常在百M到1G间
JVM的本地内存在不同的JDK之间也不一样。JRockit相对Sun JDK,做了非常好的JIT优化,但是本地内存要求更多的空间
通常Java堆内存大小推荐不大于2G
大部分操作系统默认也上不到2G,需要做内核调整--大内存模式
Java堆内存的大内存模式:
Platform
Default Maximum Heap Size
Windows on a 64 bit platform
75% of total physical memory up to 3 GB
Linux or Solaris on a 64 bit platform
75% of physical memory up to 3 GB
Windows on a 32 bit platform
75% of total physical memory up to 1 GB
Linux or Solaris on a 32 bit platform
75% of physical memory up to 1 GB
了解Java基本内存管理基本概念
400-810-2327
垃圾回收(Garbage Collection, GC)的作用:
JVM自动检测和释放不再使用的内存。
Java 运行时JVM会执行 GC,这样程序员不再需要显式释放对象。
通常在空闲内存降低到某一水平或内存分配达到某一数量后自动触发。
各种JDK的垃圾回收都有多种算法和策略(预了解详情请参考附件)
以下OutOfMemory 简称 OOM
以下Memory Leak 简称 ML
Java内存的两种表现形式
400-810-2327
Java内存问题的两种表现形式:
内存溢出错误(OOM)
内存泄露错误(ML)
现在先不管这两种内存问题是什么愿意导致的,但是最终它们都会抛出同样的内容:
共同点是什么呢?
没有空闲内存可供 JVM 或本地代码用于分配新对象或内存块
通常最终的状态就会导致 OOM 错误
在 Java 堆或本地内存中都可能发生
不同点是什么呢?
ML是已经分配好的内存或对象,当不再需要,没有得到释放而OOM则是没有足够的空间来供jvm分配新的内存块
ML 的内存曲线总体上是一条斜向上的曲线而OOM不是那样子的
Java内存问题的两个主要发生区段
400-810-2327
Java内存问题的两个主要发生区段:
Java内存--包括hea