jvm内存以及gc浅见

这里写图片描述

java虚拟机内存包括两部分:新生代和来年代,其中新生代包含Eden和两个Survivor,Eden和survivor的大小比例为8:1,创建对象首先分配在Eden和其中一个survivor(假定是survivor1),survivor2是备用的内存区域,在垃圾回收的时候会用到;当新生代内存不足分配空间创建对象,就会触发minor gc开始垃圾回收;垃圾回收步骤如下:

  1. 将Eden和survivor1中存活的对象复制到备用的survivor2,回收完后,survivor1就变成备用的内存区域
  2. 当gc后,备用内存区域空间不足以存下Eden和survivor1中存活的对象,则这些对象会直接移动到老年代
  3. 当某个对象在垃圾回收的时候频繁在survivor1和survivor2中来回复制(也就是说长久存活的对象),达到一定次数后该对象会被复制到来年代

当老年代内存不够用的时候就会触发full gc,full gc会中断线程,如果任务进程出现full gc,就需要进行内存调优了
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5,适当调小这个值,增大survivor的内存大小,这就能减少备用内存区域存不下存活对象,而导致将对象移至老年代的情况

这里列举的参数有限,可以参考下:https://blog.csdn.net/kidoo1012/article/details/54599046

个人觉得如果对java虚拟机调优有深入理解的话,可以适当调优;不过最好在代码层面上做下优化,例如减少大对象,避免过度使用内存空间,能够使用int就不用string,能够使用数组,就尽量不要用集合等等

猜你喜欢

转载自blog.csdn.net/woloqun/article/details/80639485