内存到底该如何分配
LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code and KPI, Keep progress,make a better result.
Survive during the day and develop at night。
目录
概 述
假设我们有4核8G的机器,那么给JVM的内存一般会到4G,剩下几个G会留点空余给操作系统之类的来使用.
不要想着把机器内存一下子都耗尽,其中堆内存我们可以给3G,新生代我们可以给到1.5G,老年代也是1.5G。
然后每个线程的Java虚拟机栈有1M,那么JVM里如果有几百个线程大概会有几百M
然后再给永久代256M内存,基本上这4G内存就差不多了。
同时还要记得设置一些必要的参数,比如说打开“-XX:HandlePromotionFailure”选项(不熟悉这个参数的,可以回头复习一下专栏之前的文章)
“-Xms3072M -Xmx3072M -Xmn1536M -Xss1M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:HandlePromotionFailure”
只要判断“老年代可用空间”> “新生代对象总和”,或者“老年代可用空间”> “历次Minor GC升入老年代对象的平均大小”
上述两个条件满足一个,就可以直接进行Minor GC,不需要提前触发Full GC了。
但是1秒过后这60MB对象都会变成垃圾,那么新生代1.5G的内存空间大概需要25秒就会占满,如下图。
首先在进行JVM优化的时候,第一个要考虑的问题,就是你通过估算,你的新生代的Survivor区到底够不够?
按照上述逻辑,首先每次新生代垃圾回收在100MB左右,有可能会突破150MB,那么岂不是经常会出现Minor GC过后的对象无法放入Survivor中?然后岂不是频繁会让对象进入老年代?
还有,即使Minor GC后的对象少于150MB,但是即使是100MB的对象进入Survivor区,因为这是一批同龄对象,直接超过了Survivor区空间的50%,此时也可能会导致对象进入老年代。
可达性分析算法(Reachability Analysis):
.链接
可达性分析算法GC Roots的对象包含有哪些?
如何判断对象是否存活
相关工具如下:
分析:
小结:
springboot 整合 JVM类加载过程与双亲委派机制与类加载器与类字节码详解学习,请大家指正~
参考资料和推荐阅读
1.链接: 参考资料.