JVM之一——对象的创建和内存分布


用简单通俗的话来记录自己对架构的理解

1.背景

对于android工程师,Dalvik、ART虚拟机是进阶必走之路,那么,这两种虚拟机也都是JVM,要了解它们,JVM的入门必不可少。

2.内容脑图

在这里插入图片描述
对于为啥学习、设计它的原因、JVM发展历史就不做具体的阐述,内存区域的详细讲解,参考:
https://blog.csdn.net/FullStackDeveloper/article/details/111412340?spm=1001.2014.3001.5501
这篇博客主要讲述JVM对象和JVM优化的相关技术。

3.JVM对象

1.JVM对象创建

让我来look一下,String s = new String(),这行代码简单的不简单了,但是,你如果完全认为简单,那就是to young to simple了,让我们来看看,它说经历的过程。
在这里插入图片描述

1.检查加载

大家还记的对象是怎么来的吗?究其本质,是由字节码文件创建的Class对象newInstance而来。那么字节码文件又是虚拟机加载进来,在加载的过程中,进行检查等流程。
类加载:
当需要使用某个类时,虚拟机将会加载它的".class"文件进入方法区,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载。
在这里插入图片描述

2.分配内存

(1)分配方式
堆内存分配方式是由两种:
指针碰撞:适用于连续内存
空闲列表:适用于回收内存
(2)并发安全问题:
(a)CAS机制(Compare and Swap)
AS机制中使用了3个基本操作数: 内存地址V,旧的预期值A,要修改的新值B。更改赋值时和分配内存时的旧值做对比。
(b)本地线程分配缓存
其实就是逃逸技术,逃逸技术可参考

3.内存空间初始化

对象的成员进行内存分配初始化。

4.设置

对象包括hash,对象头等信息,用来垃圾回收的年龄计算等

5.对象初始化

对象的地址指向引用的成员变量

2.JVM对象内存分布

在这里插入图片描述

1.对象头

包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。
java的对象头由以下三部分组成:
1,Mark Word
Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。
Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。
2,指向类的指针
该指针在32位JVM中的长度是32bit,在64位JVM中长度是64bit。
Java对象的类数据保存在方法区。
3,数组长度(只有数组对象才有)

2.实例数据

各种成员变量和值。

3.对齐填充

因为JVM要求java的对象占的内存大小应该是8bit的倍数,所以后面有几个字节用于把对象的大小补齐至8bit的倍数,没有特别的功能。

3.JVM对象访问

大家可以看到方法区的对象型数据,实际上就是字节码对象。

1.句柄访问

在堆区有个句柄表,进行地址和指引的对应。
在这里插入图片描述

2.指针访问

栈区保存堆区各个对象的地址。现在的JVM使用的主流
在这里插入图片描述

4.JVM的逃逸技术

本质上就是分析对象的作用域范围。
举个例子:创建1个亿的Test对象,如果全部在堆区进行开辟的话,触发大量GC,所以,根据场景分析,在栈帧创建一个对象,从而实现更快,更节省的调用。

for(int i = 0 ;i<10000000;i++){
	Test test = new Test();
}

那么就有两个问题了。
1.对象一定在堆上么?
不一定,存在逃逸技术,就可能在栈上。
2.我如何验证这个生癖的技术?
对于HotJVM,只需要在设置项打开逃逸分析和本地缓存

-XX:+(-)DoEscapeAnalysis:启用逃逸分析(默认打开)
-XX:+(-)UseTLAB 本地线程分配缓冲(默认打开)
-XX:+(-)EliminateAllocations:标量替换(默认打开)
-XX:+(-)PrintGC 打开GC日志

不要问我安卓怎么校验,我也没想到如何实现!

5.站在巨人的肩膀

1.对象的创建及内存分布
https://developer.51cto.com/art/202104/659482.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值