工作中出现的内存溢出异常, 最后只需要调节相应内存大小即可。
-
永久代内存溢出实例
永久代内存溢出实例 -
jvm各参数含义
jvm参数含义 -
实际配置实例
//其中各个参数都是可以在实际启动中配置
${JAVA_HOME}/bin/java -Dlog4j.logtype=$ERROR_FILENAME -Xms2048m -Xmx2048m -XX:MaxPermSize=512M -XX:+PrintGC-verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -classpath $CLASSPATH com.baidu.fengchao.sirius.scripts.deletefile.DeleteFileScripts wordcleanup >> ${log_file} 2>&1
- java 虚拟机实际分配情况
image.png为了进行高效的垃圾回收,虚拟机把堆内存划分成新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)3个区域。
- jdk8中对永久代的升级
jdk8中做法:
把永久代从Java堆中移除了, 并把类的元数据直接保存在本地内存区域(堆外内存),称之为元空间.
好处:
而在JDK8中,类的元数据保存在本地内存中,元空间的最大可分配空间就是系统可用内存空间,可以避免永久代的内存溢出问题,不过需要监控内存的消耗情况,一旦发生内存泄漏,会占用大量的本地内存。
ps:JDK7之前的HotSpot,字符串常量池的字符串被存储在永久代中,因此可能导致一系列的性能问题和内存溢出错误。在JDK8中,字符串常量池中只保存字符串的引用。
参考:
1 JVM启动参数-Xmx的默认值是多少?
2 sun 文档
3 Java GC的那些事(上)
4 Java GC的那些事(下)
网友评论