前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM的内存对象介绍[创建和访问]

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

作者头像
用户4919348
发布2019-04-02 11:26:16
4610
发布2019-04-02 11:26:16
举报
文章被收录于专栏:波波烤鸭波波烤鸭

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

对象的创建

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

代码语言:javascript
复制
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.通过直接指针访问对象

在这里插入图片描述
在这里插入图片描述

两种方式的比较

方式

优点

句柄

稳定,对象被移动只要修改句柄中的地址

直接指针

访问速度快,节省了一次指针定位的开销

在我们常用的Sun HostSpot虚拟机而言就是使用的第二种方式,直接指针的方式来实现的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对象的创建
    • 内存的分配原则
      • 内存的分配方法
        • 内存分配的安全问题
        • 对象的访问定位
          • 1.通过句柄访问对象
            • 2.通过直接指针访问对象
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档