乐趣区

关于jvm:JVM学习之路2对象内存布局及逃逸分析

继上一篇介绍完 JVM 内存模型之后,这篇筹备聊聊对象的内存布局以及逃逸剖析。咱们晓得对象个别是调配在堆上的,然而你晓得对象在堆上是怎么寄存的吗?咱们平时程序中在应用的时候是怎么找到对象的?
知识点
1、内存对象布局
2、逃逸剖析

内存对象布局

先说一下咱们平时是怎么创建对象的
A a = new A();
如上所示,一个对象 A 就被创立进去了。看似简略的一行语句,其实虚拟机为咱们做了很多事件。
首先虚拟机去常量池中查找是否有类 A 的符号援用,并查看该符号援用的类 A 是否曾经被虚拟机所加载过,如果没有则先进行加载(具体的类加载机制咱们会在前面的系列文章中介绍), 如果曾经被加载过则能够确定为该类对象所调配的内存大小并进行内存调配,大略流程如下:

这里波及到两种调配形式:指针碰撞和闲暇列表

指针碰撞

简略来说,基于内存规整的前提下将内存分为两局部,用过的内存放到左侧,没用过的内存放到右侧,两头放一个指针来分界,当为对象分配内存时,向闲暇区挪动一块该对象大小的空间:

闲暇列表

下面是基于内存规整的状况下进行指针碰撞,如果内存不规整的话,怎么解决?那就要说到闲暇列表了,简略来说就是已分配内存和未分配内存是交织的,虚拟机保护一份列表来晓得哪些内存是可用的,在进行对象调配的时候会从列表中取一块足够空间的内存,调配完结后更新列表:

下面两种调配形式哪种更好呢?这个没有肯定哪个好或者哪个不好,取决于 java 的内存是否规整,而 java 内存是否规整又取决于所用的垃圾收集器是否带有压缩整顿法决定,所以在前面介绍垃圾收集器的时候再具体聊。
没写完,工夫关系,今天持续。。

退出移动版