JVM学习之路2-对象内存布局及逃逸分析

继上一篇介绍完JVM内存模型之后,这篇准备聊聊对象的内存布局以及逃逸分析。我们知道对象一般是分配在堆上的,但是你知道对象在堆上是怎么存放的吗?我们平时程序中在使用的时候是怎么找到对象的?
知识点
1、内存对象布局
2、逃逸分析

内存对象布局

先说一下我们平时是怎么创建对象的
A a = new A();
如上所示,一个对象A就被创建出来了。看似简单的一行语句,其实虚拟机为我们做了很多事情。
首先虚拟机去常量池中查找是否有类A的符号引用,并检查该符号引用的类A是否已经被虚拟机所加载过,如果没有则先进行加载(具体的类加载机制我们会在后面的系列文章中介绍),如果已经被加载过则可以确定为该类对象所分配的内存大小并进行内存分配,大概流程如下:
JVM学习之路2-对象内存布局及逃逸分析_第1张图片
这里涉及到两种分配方式:指针碰撞和空闲列表

指针碰撞

简单来说,基于内存规整的前提下将内存分为两部分,用过的内存放到左侧,没用过的内存放到右侧,中间放一个指针来分界,当为对象分配内存时,向空闲区移动一块该对象大小的空间:
JVM学习之路2-对象内存布局及逃逸分析_第2张图片

空闲列表

上面是基于内存规整的情况下进行指针碰撞,如果内存不规整的话,怎么处理?那就要说到空闲列表了,简单来说就是已分配内存和未分配内存是交错的,虚拟机维护一份列表来知道哪些内存是可用的,在进行对象分配的时候会从列表中取一块足够空间的内存,分配结束后更新列表:
JVM学习之路2-对象内存布局及逃逸分析_第3张图片
上面两种分配方式哪种更好呢?这个没有一定哪个好或者哪个不好,取决于java的内存是否规整,而java内存是否规整又取决于所用的垃圾收集器是否带有压缩整理法决定,所以在后面介绍垃圾收集器的时候再具体聊。
没写完,时间关系,明天继续。。

你可能感兴趣的:(jvm)