我有台16G内存的服务器,JVM用的默认值(听说默认最小是1/64,最大是1/4即256M和4096M),
但是运行一段时间后报了java.lang.OutOfMemoryError: Java heap space异常,tomcat也挂了,我远程服务器上去看,发现tomcat只占了40万K的内存,
总内存也只占用了20%,倒是CPU占在70%(正常情况下应该是10%以下)。
求支招啊,怎么解决。
我觉得应该是程序陷入了某个死循环,但是我不知道这个bug在哪(有没有可以监控请求所占用资源的东东呢),还有没有其他什么可能会造成这种情况呢?
假如是4核的,jdk 8以上,推荐一个配置
-server
-Xms8g
-Xmx8g
-XX:MetaspaceSize=512m 7的话用持久代配置
-XX:MaxMetaspaceSize=512m 7的话用持久代配置
-Xmn5m
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSMaxAbortablePrecleanTime=5000
-XX:+CMSClassUnloadingEnabled
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=80
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/admin/java/java.hprof
-Xloggc:/home/admin/java/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:MaxDirectMemorySize=2g
-XX:SurvivorRatio=10
-XX:+ExplicitGCInvokesConcurrent
-XX:ParallelGCThreads=4
可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young Generation 和Tenured Generaion 之和。
在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息。
解决方法:手动设置JVM Heap(堆)的大小。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。