最近在一次搭建公司系统运行环境的时候tomcat总是报出
java.lang.OutOfMemoryError PermGen space
的问题,即内存溢出
在解决这个问题的时候
一.问题解决
此处用到一个命令:jmap
显示java堆中的详细信息(进程号7180)
C:\Users\zhangyu>jmap -heap 7180
Attaching to process ID 7180, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.45-b01
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1004535808 (958.0MB) //最大堆大小,默认为物理内存的1\4
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB //64位操作系统理论无限制
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB) //非堆区大小
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 163119104 (155.5625MB)
used = 1433824 (1.367401123046875MB)
free = 161685280 (154.19509887695312MB)
0.8790043378364805% used
From Space:
capacity = 65536 (0.0625MB)
used = 0 (0.0MB)
free = 65536 (0.0625MB)
0.0% used
To Space:
capacity = 8060928 (7.6875MB)
used = 0 (0.0MB)
free = 8060928 (7.6875MB)
0.0% used
PS Old Generation
capacity = 669712384 (638.6875MB)
used = 89397320 (85.25592803955078MB)
free = 580315064 (553.4315719604492MB)
13.348613843162859% used
PS Perm Generation
capacity = 85983232 (82.0MB)
used = 85983168 (81.99993896484375MB)
free = 64 (6.103515625E-5MB)
99.99992556688262% used
可以发现 Perm Generation 明显不够用,因此需要增大该空间
-XX:PermSize=128M
-XX:MaxPermSize=256M
而在上一篇文章中,对JVM的内存说明并不是很详细
补充以下:
二.JVM内存
1.整体内存可以分为堆区和非堆区
堆区:
所有new的对象都在堆区
新生代、中生代、老年代源自于对堆区的细分
Java中每新new一个对象所占用的内存空间就是新生代的空间,当java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到中生代,中生代的被转移到老生代。
-XX:MaxNewSize=518 等是对新生代的最大值进行设置
非堆区:
包括持久带, 用来存放静态文件,如Java类、方法等。
几个参数:
1.堆(Heap)内存分配
-Xms : 初始堆大小
-Xmx: 最大堆大小,可设置为与Xms一样
-XX:NewSize=n:设置年轻代大小
2.堆(Heap)内存分配
-XpermSize = n
-XMaxPermSize = n
注意-XMaxPermSize和-Xmx的总和不能超过物理机的最大内存值