服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - 详解JVM的内存对象介绍[创建和访问]

详解JVM的内存对象介绍[创建和访问]

2021-07-21 14:35波波烤鸭 Java教程

这篇文章主要介绍了JVM的内存对象介绍[创建和访问],文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

对象的创建

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

?
1
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的内存对象介绍[创建和访问]详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://blog.csdn.net/qq_38526573/article/details/87651250

延伸 · 阅读

精彩推荐