java GC详解

2019-02-18  本文已影响0人  Aaron_Swartz

工作中出现的内存溢出异常, 最后只需要调节相应内存大小即可。

//其中各个参数都是可以在实际启动中配置
${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

为了进行高效的垃圾回收,虚拟机把堆内存划分成新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)3个区域。

image.png

jdk8中做法:
把永久代从Java堆中移除了, 并把类的元数据直接保存在本地内存区域(堆外内存),称之为元空间.
好处:
而在JDK8中,类的元数据保存在本地内存中,元空间的最大可分配空间就是系统可用内存空间,可以避免永久代的内存溢出问题,不过需要监控内存的消耗情况,一旦发生内存泄漏,会占用大量的本地内存。
ps:JDK7之前的HotSpot,字符串常量池的字符串被存储在永久代中,因此可能导致一系列的性能问题和内存溢出错误。在JDK8中,字符串常量池中只保存字符串的引用。

参考:
1 JVM启动参数-Xmx的默认值是多少?
2 sun 文档
3 Java GC的那些事(上)
4 Java GC的那些事(下)

上一篇 下一篇

猜你喜欢

热点阅读