JVM中内存对象的示例分析

发布时间:2021-06-07 12:46:38 作者:小新
来源:亿速云 阅读:170

这篇文章主要为大家展示了“JVM中内存对象的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JVM中内存对象的示例分析”这篇文章吧。

作为java程序员对应Object应该是非常熟悉的,但是对于对象在JVM中的一些情况并不是很清楚,所以本文就来记录下对象在JVM中的一些内容

对象的创建

java程序中创建对象的常用方式是:

Object obj = new Object();

该行代码的执行过程如下:


JVM中内存对象的示例分析

从图中我们可以发现对象创建的步骤如下

  1. 执行new执行

  2. 检查这个指令参数是否能够在常量池中定位到一个类的符号引用,并且检查这个符号引用所代表的类是否已经被加载,解析和初始化。

  3. 如果该类没有被加载则先执行类的加载操作

  4. 如果该类已经被加载,则开始给该对象在jvm的堆中分配内存。分配规则后面介绍

  5. 虚拟机初始化操作,虚拟机对分配的空间初始化为零值。

  6. 执行init方法,初始化对象的属性,至此对象被创建完成。

  7. java虚拟机栈中的Reference执行我们刚刚创建的对象。

在上面的过程中的类加载的过程,后面会单独介绍,而内存分配这块我们来介绍下

内存的分配原则

内存分配的基本原则:

序号介绍
1优先在Eden分配,如果Eden空间不足虚拟机则会进行一次MinorGC
2大对象直接接入老年代,很长的字符串或数组
3长期存活的对象进入老年代,每个对象都有一个age,当age到达设定的年龄的时候就会进入老年代,默认是15岁

内存的分配方法

内存分配的方法有两种:指针碰撞(Bump the Pointer)和空闲列表(Free List)

分配方法说明收集器
指针碰撞内存地址是连续的Serial和ParNew收集器
空闲列表内存地址不连续CMS收集器和Mark-Sweep收集器

内存分配的安全问题

在分配内存的同时,存在线程安全的问题,即虚拟机给A线程分配内存过程中,指针未修改,B线程可能同时使用了同样一块内存。
在JVM中有两种解决办法:

  1. 同步处理,即CAS(compare & swap)搭配失败重试的方式

  2. 将内存分配的动作按线程分配到不同空间中,每个线程都有一小块内存,成为本地线程分配缓冲(Thread Local Allocation Buffer即TLAB)。

对象的访问定位

建立对象是为了使用对象,java程序是通过栈上的reference数量来操作堆上的具体的对象,具体操作对象的方式有两种:

1.通过句柄访问对象

JVM中内存对象的示例分析

2.通过直接指针访问对象

JVM中内存对象的示例分析

两种方式的比较

方式优点
句柄稳定,对象被移动只要修改句柄中的地址
直接指针访问速度快,节省了一次指针定位的开销

以上是“JVM中内存对象的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. JVM内存结构划分的示例分析
  2. JVM内存区域的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm

上一篇:怎么创建Java线程池

下一篇:c++如何创建二维动态数组与内存释放问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》