01 | JVM-存储机制

2019-06-12  本文已影响0人  小亮__

JVM内存因为对象的生命周期,分配和回收的频率不一样,所以对内存区域进行了区域划分,主要被分为三块,新生代老年代持久代

设计各个分区数据大小的经验

活跃数据的大小,是指项目平稳运行时期,长期存活的对象在堆中占用的大小,也就是在Full GC之后,老年代的大小,比较准确的计算方法时,多次获得GC数据,通过取平均值的方式计算活跃数据的大小

年龄判断
常用参数
OOM异常一般主要有如下2种原因:
  1. 年老代溢出,表现为:java.lang.OutOfMemoryError:Javaheapspace
    这是最常见的情况,产生的原因可能是:设置的内存参数Xmx过小或程序的内存泄露及使用不当问题。
    例如循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存。还有的时候虽然不会报内存溢出,却会使系统不间断的垃圾回收,也无法处理其它请求。这种情况下除了检查程序、打印堆内存等方法排查,还可以借助一些内存分析工具,比如MAT就很不错。

  2. 持久代溢出,表现为:java.lang.OutOfMemoryError:PermGenspace
    通常由于持久代设置过小,动态加载了大量Java类而导致溢出,解决办法唯有将参数 -XX:MaxPermSize 调大(一般256m能满足绝大多数应用程序需求)。将部分Java类放到容器共享区(例如Tomcat share lib)去加载的办法也是一个思路,但前提是容器里部署了多个应用,且这些应用有大量的共享类库

参数方案(试用于web并发量比较大的服务器):
java -jar server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k 
 -XX:SurvivorRatio=6 -XX:MaxPermSize=256m -XX:ParallelGCThreads=8
 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC
调优说明:

设置完成后,使用怎么的方法,查看,可是使用 jmap -heap PID 实时查看进程使用情况


引用类型

分配担保

在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor GC,尽管这次Minor GC是有风险的;如果小于,或者HandlePromotionFailure设置不允许冒险,那这时也要改为进行一次Full GC

永久代到元空间的变更

首先需要了解的是为什么要去除永久代,成立元空间,因为以前的永久代有一些问题

总结一下:就是将以前永久代中,内存大小浮动比较大的信息移到了JAVA堆中,而比较确定的留在了元数据中

上一篇 下一篇

猜你喜欢

热点阅读