JVM内存模型和常用配置

JVM内存模型如下:



为了垃圾回收使用,堆内存中又区分新生代、老年代。


运行生成的对象实例都存储到Eden中。垃圾回收时,将Eden中存活的对象和幸存区From中的存活对象一起复制到幸存区的To,然后全部清空Eden和From,此时From和To就互换角色了(他俩实际一模一样,来回折腾)当有的存活对象在From和To中折腾次说多了,达到一个阈值(可配置),就放到Old老年代里面,以后不删除了。
Permanent永久代:是指内存的永久保存区域,主要存放Class和Meta的信息,GC不会在主程序运行期对Permanent进行清理,所以如果你的应用会加载很多class的话,就很可能出现PermGen space错误。




常见错误:
堆内存不足:Java heap space
方法区内存不足(永久代):PermGen space
虚拟机栈和本地方法栈溢出:java.lang.StackOverflowError




下面说说常用的一些JVM内存相关配置:

-Xms,初始堆内存,-Xms2G等价于-XX:InitialHeapSize=2G
-Xmx,最大堆内存,-Xmx2G等价于-XX:MaxHeapSize=2G,最好-Xmx和-Xms设置一样大,减少申请内存的消耗。
-XX:MaxNewSize,设置新生代最大大小
-XX:NewRatio,设置老年代与新生代的比例,优点是新生代大小会随着整个堆大小动态扩展。
如-XX:NewRatio=3 指定老年代/新生代为3/1. 老年代占堆大小的 3/4 ,新生代占 1/4。
如,-XX:NewSize=32m -XX:MaxNewSize=512m -XX:NewRatio=3,JVM 会尝试为新生代分配四分之一的堆大小,但不会小于32MB或大于521MB。
-XX:SurvivorRatio,伊甸园区(Eden)与幸存区大小比例
例如, -XX:SurvivorRatio=10 表示伊甸园区(Eden)是幸存区To大小的10倍(也是幸存区From的10倍).所以,伊甸园区(Eden)占新生代大小的10/12, 幸存区From和幸存区To每个占新生代的1/12,两个幸存区永远是一样大的。

-XX:PermSize,永久代初始大小
-XX:MaxPermSize,永久代最大值,永久代大小并不会被包括在使用参数-XX:MaxHeapSize(-Xmx)设置的堆内存大小中,两者是独立的。

-Xss设置每个线程的堆栈大小。在相同物理内存下,减小这个值能生成更多的线程线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。


-XX:+UseCodeCacheFlushing,当代码缓存被填满时让JVM放弃一些编译代码,如果代码缓存不断增长,例如,因为热部署引起的内存泄漏,可以使用这个配置。

-XX:+HeapDumpOnOutOfMemoryError,让JVM在发生内存溢出时自动的生成堆内存快照,默认情况下,堆内存快照会保存在JVM的启动目录下名为java_pid<pid>.hprof 的文件里,也可以使用HeapDumpPath方法指定路径
-XX:HeapDumpPath=<path>,让JVM在发生内存溢出时自动的生成堆内存快照的路径
-XX:OnOutOfMemoryError,当内存溢发生时,可以可以执行一些指令,如内存溢出时,执行cleanup.sh脚本
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:OnOutOfMemoryError ="sh ~/cleanup.sh"

-XX:+PrintCommandLineFlags,打印修改过的参数,如修改了-Xms,就会打印出-Xms。

-XX:InitialCodeCacheSize,代码缓存,它是用来存储已编译方法生成的本地代码,如果代码缓存被占满,JVM会打印出一条警告消息,并切换到interpreted-only 模式:JIT编译器被停用,字节码将不再会被编译成机器码。因此,应用程序将继续运行,但运行速度会降低一个数量级。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值