jvm-内存区域划分

47 阅读2分钟

如何分?

内存区域划分,是怎么分的呢?根据什么来分的呢?

主要是根据作用和生命周期这两个维度分。

分几块?

比如,方法局部变量,是在方法里面,生命周期是和线程一样,线程执行完了死了,方法局部变量也就是完了死了。所以,方法局部变量是在线程栈这个区域里面。

然后就是平常听得最多的关键字:对象。对象就是每个对象的数据都不一样,然后生命周期是和垃圾回收相关。对象的所在区域是对象堆。

最后还有类的数据,什么叫类的数据呢?就是static数据,final数据,字符串字面量,都是类的数据,和对象没关系,就是不管是哪个对象,这些数据都是这个值。

示意图

下面的这几个图比较好,上面有箭头和注释,可以多看一下,看了之后,就有一个整体的概念。

image.png

image.png

image.png

image.png

对象堆区域细分

上文说到了对象堆,对象堆这个区域其实可以细分,为什么要细分?细分是要解决问题的,不是吃饱了撑得没事干去细分它,徒增八股文,那为什么要细分它呢?因为细分之后,可以更好的回收垃圾对象!

具体来说,其实是因为不同的对象生命周期是不一样的,所以要区分,那怎么区分呢?其实就是根据生命周期这个维度来区分,也就是说,活的短一点的,划到年轻代,活的久一点的,划到老年代,就是这样,so easy!

然后,年轻代,还可以继续细分,按8:1:1的比例分成三个区域。这个倒不是因为生命周期不同,但是也是为了更好的回收垃圾对象,具体什么更好呢?这个是垃圾回收算法方面的,细节不多讲,总之按这种方法可以提高垃圾回收算法的速度。

参考

深入理解java虚拟机


另外,就是美团的几篇文章

tech.meituan.com/2020/11/12/…

tech.meituan.com/2017/12/29/…

tech.meituan.com/2016/09/23/…