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

 更新时间:2019年03月13日 10:21:17   作者:波波烤鸭  
这篇文章主要介绍了JVM的内存对象介绍[创建和访问],文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

对象的创建

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

Object obj = new Object();

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



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

  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.通过句柄访问对象

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

两种方式的比较

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

以上所述是小编给大家介绍的JVM的内存对象介绍[创建和访问]详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Activiti7通过代码动态生成工作流实现详解

    Activiti7通过代码动态生成工作流实现详解

    这篇文章主要为大家介绍了Activiti7通过代码动态生成工作流实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • IntelliJ IDEA中出现

    IntelliJ IDEA中出现"PSI and index do not match"错误的解决办法

    今天小编就为大家分享一篇关于IntelliJ IDEA中出现"PSI and index do not match"错误的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 浅析Java模板方法的一种使用方式

    浅析Java模板方法的一种使用方式

    模板方法说白了就是将一段代码模板化,将通用的代码段抽取出来,并提供一些自定义的接口去定制的特定位置的某些业务功能。本文主要来和大家聊聊它的一种使用方式,希望对大家有所帮助
    2023-02-02
  • SpringBoot+Hutool实现图片验证码的示例代码

    SpringBoot+Hutool实现图片验证码的示例代码

    图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用,本文主要介绍了SpringBoot+Hutool实现图片验证码的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java带返回值的方法的定义和调用详解

    Java带返回值的方法的定义和调用详解

    在java中,方法就是用来完成解决某件事情或实现某个功能的办法。方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值,这篇文章我们来探究一下带返回值的方法的定义和调用
    2022-04-04
  • Java数据结构之图的原理与实现

    Java数据结构之图的原理与实现

    图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。本文将详细介绍图的原理及其代码实现,需要的可以参考一下
    2022-01-01
  • 详解时间轮TimeWheel的工作原理

    详解时间轮TimeWheel的工作原理

    时间轮(TimeWheel)作为一种高效率的计时器实现方案,在1987年发表的论文Hashed and Hierarchical Timing Wheels中被首次提出。本文主要来聊聊它的工作原理,感兴趣的可以了解一下
    2023-02-02
  • spring @Conditional的使用与扩展源码分析

    spring @Conditional的使用与扩展源码分析

    这篇文章主要介绍了spring @Conditional的使用与扩展,这里需要注意如果Condition返回的是false,那么spirng就不会对方法或类进行解析,具体源码分析跟随小编一起看看吧
    2022-03-03
  • springboot 实现接口灰度发布的实例详解

    springboot 实现接口灰度发布的实例详解

    这篇文章主要介绍了springboot 实现接口灰度发布,简单来说就是能够根据业务规则的调整交互上呈现不同的形式,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java Thread之Sleep()使用方法总结

    Java Thread之Sleep()使用方法总结

    这篇文章主要介绍了Java Thread之Sleep()使用方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论