- Java heap space堆内存
在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
-Xms初始空间
-Xmx最大空间
-Xmn最小值
例如:java -jar -Xmn16m -Xms64m -Xmx128m
-Xms和-Xmx这两个值不通的时候,就会出现一个可伸缩的空间,而这个空间的存在会损耗服务的性能。因为扩容和释放空间都是有性能损耗的。所以一般要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
如果Heap Size设置偏小,除了这些异常信息外,还会发现程序的响应速度变慢了。GC占用了更多的时间,而应用分配到的执行时间较少。Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
注:linux服务有这种说法:tomcat 在重启的时候,不是使用的 ./bin/shutdown.sh 而是使用 kill -9 xxx 直接杀掉,这样的话,存在 PermGen space 里面的内存不会被释放的,这样多长进行 kill 之后,就会导致系统的内存被渐渐吃完了,直到最后 tomcat 报错。(虽然有项目是linux服务,但未曾遇到这种情况)
-PermGen space永久代
全称是Permanent Generation space,是指内存的永久保存区域。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理。
-Xx:permsize是永久域的初始值
-xx:maxpersize是最大分配的永久域空间
-xx:maxnewsize是新域最大值
可通过jconsole来查看分配的PermGen space大小
附注:jdk如果是32bit的则堆内存一般不允许超过1G,调的再大一点启动tomcat会出现闪退情况,这时就需要替换64bit的jdk版本。jdk版本查看方式:在jdk的bin目录下打开命令窗口,输入:
java.exe -version
输出结果包含64bit则表示是64位的,否则是32位的。
也可在此处输入以下命令,来测试堆内存设置是否成功:
java.exe -Xmx1000m -version