JVM内存溢出相关问题

问题

平时我们遇到最多的内存溢出的问题,我这里大略总结为以下三种

  • OutOfMemoryError: Java heap space
  • OutOfMemoryError: PermGen space
  • OutOfMemoryError: unable to create new native thread

解决方案

根据实际情况,首先应排查应用项目本身的问题,除此之外,
Java heap space的问题我们可以通过增大heap内存(即堆内存)来解决,比如

1
-Xms:1024m -Xmx:1024m

其中Xms指初始堆大小,默认为物理机内存的1/64,Xmx指最大堆大小,默认为物理机内存的1/4。注意:堆内存受限于操作系统。详细

PermGen space 可以通过减少或者共享第三方jar库来解决,或者调整以下参数

1
-XX:PermSize=64M -XX:MaxPermSize=128m

至于最后一种无法创建本地线程的问题,需要根据实际情况进行计算:
具体计算公式如下:

1
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

  • MaxProcessMemory 指的是一个进程的最大内存
  • JVMMemory JVM内存
  • ReservedOsMemory 保留的操作系统内存
  • ThreadStackSize 线程栈的大小

比如,32位的windows的MaxProcessMemory为2G,eclipse默认启动JVMMemory为64M,ReservedOsMemory一般为130M左右,JDK 1.6默认的ThreadStackSize为325k,所以代入公式为(210241024-64*1024)/325=5841。
所以理论上分配给JVM的内存越大就会制约它所能创建的线程数。

小结

解决内存溢出的问题当然不能依赖于调增JVM内存,更重要的是对项目进行质量上的监管和优化,然后配合JVM进行优化。

文章目录
  1. 1. 问题
  2. 2. 解决方案
  3. 3. 小结
,