Java中对象的访问

JAVA是面向对象的语言,那么在JAVA虚拟机中,存在非常多的对象,对象访问是无处不在的。即时是最简单的访问,也会涉及到JAVA栈、JAVA堆、方法区这三个非常重要的内存区域之间的关联关系。

比如:

Object obj = new Object();

其中,“Object obj”这部分语义作为一个reference类型数据出现,将存储到JAVA栈的本地变量表中。new Object()将生成一个实体对象,存储在JAVA堆中,包含了Object类型的所有实例数据值(对象中各个字段的数据)的结构化内存,根据具体类型以及虚拟机实现的对象内存布局的不同,这块内存的长度是不固定的。另外,在JAVA堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现接口、方法等)的地址信息,这些类型数据存储在方法区中。

由于reference类型在JAVA虚拟机规范里面只规定了一个指向对象的引用,并没有定义这个引用该通过哪种方式去定位,以及访问到JAVA堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:句柄和直接指针。

  • 句柄

JAVA堆中将会划分出来一块内存作为句柄池,reference中就是存储了对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。

使用句柄访问的最大好处是reference中存储的是稳定的句柄地址,在对象被移动时,只会改变句柄中的实例数据指针,而reference本身不需要被修改。

  • 直接指针

相比较句柄的访问方式,JAVA堆中不会单独划分内存,reference中直接存储了对象地址,而对象中包含了对象类型数据的地址信息。

使用直接指针的最大好处就是速度更快,节省了一次指针定位需要的时间开销,由于JAVA对象访问十分频繁,这类开销积小成多后也是一项非常可观的执行成本。Sun HotSpot虚拟机使用的就是这种访问方式。

一个实体类,名为Stu:

  1. public class Stu extends Object{
  2. private String name;
  3. private int age;
  4. public Stu(String name,String age){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public String getName(){
  9. return this.name;
  10. }
  11. ...
  12. }

创建Stu对象:

Stu kevin = new Stu(“kevin”,15);

这样根据上文解释如下:

kevin作为一个reference类型的变量存储在本地变量表中,在hot spot虚拟机中,存储的是(kevin=)具体对象的直接地址;new Stu(“kevin”,15)就是实例化了一个对象,JAVA堆中Stu实体类的所有的字段信息,比如name=”kevin”,age=15。此时,JAVA堆中还存储了Stu对象的类型数据的地址信息,通过这个地址在方法区中可以查找对象的类型、父类、实现的接口、方法等信息。

【2】JVM-JAVA对象的访问的更多相关文章

  1. Java对象的访问定位

    java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象.由于reference类型在java虚拟机规范中只规定了一个对象的引用,并没有定义这个这个引用应该 ...

  2. Java对象的访问方式

    之前写过一篇随笔 https://www.cnblogs.com/qianjinyan/p/10352749.html 现在看看,貌似不是很准确,方法区和栈应当区分开来,两者有很大的区别 看下面的一个 ...

  3. JVM —— Java 对象占用空间大小计算

    零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 须要知道缓存的对象是否会超过 JVM 最大堆限制, 假设会超 ...

  4. Java对象的访问

    对象访问在Java语言中无处不在,即使最简单的访问也涉及Java栈.Java堆.方法区这三个重要的内存区域中. 例:Object obj = new Object(); Object obj     ...

  5. Java对象的内存布局以及对象的访问定位

    一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...

  6. 3 Java对象的内存布局以及对象的访问定位

    先来看看Java对象在内存中的布局   一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...

  7. 【深入理解JVM】:Java对象的创建、内存布局、访问定位

    对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流 ...

  8. Java对象在JVM中的生命周期

          当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时 ...

  9. jvm学习记录-对象的创建、对象的内存布局、对象的访问定位

    简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...

  10. Java对象的创建、内存布局和访问定位

    在Java运行时数据区中,我们知道了虚拟机内存的概况,本文介绍虚拟机内存中的数据的其它细节,如对象如何创建.如何布局以及如何访问. 基于实用的原则,这里以HotSpot虚拟机和常用的内存区域Java堆 ...

随机推荐

  1. 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-3 模态弹出框

    模态弹出框(Modals) 这一小节我们先来讲解一个“模态弹出框”,插件的源文件:modal.js. 右侧代码编辑器(30行)就是单独引入 bootstrap 中发布出的“modal.js”文件. 样 ...

  2. 前端建立一个本地服务器:browser-sync

    1.安装browser-sync: npm i browser-sync --save-dev 2.在package.json中添加启动代码: "start": "./n ...

  3. Markdown语法学习(二)

    概述 宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所 ...

  4. c++ primer读书笔记之c++11(三)

    1 =default构造函数限定符 c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数.析构或赋值运算函数.参考代码如下: class CtorDftTy ...

  5. 内部排序比较(Java版)

    内部排序比较(Java版) 2017-06-21 目录 1 三种基本排序算法1.1 插入排序1.2 交换排序(冒泡)1.3 选择排序(简单)2 比较3 补充3.1 快速排序3.2 什么是桶排序3.3 ...

  6. ubuntu桌面使用总结

    一.ubuntu12.04 修改系统字体:sudo apt-get install gnome-tweak-tool 关于ubuntu字体,个人习惯记录一下:默认字体:文泉驿微米黑  10桌面字体:文 ...

  7. Django服务端读取excel文件并且传输到接口

    path_name = "opboss_download_" + str(int(time.time())) + ".csv" print(path_name) ...

  8. pual_bot 天气插件编写

    最近在玩pual_bot,感觉很不错,最近天气插件失效了,就结合百度api重新写了一个,也提交了. https://github.com/coldnight/pual_bot #!/usr/bin/e ...

  9. docker探索-镜像使用(四)

     前言 当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载. 1.查看本地主机上的镜像列表 [root@ ...

  10. JQUERY双下拉框内容的左右移动

     教程源码:http://bbs.php100.com/read-htm-tid-74060.html用到的方法为:appendTo() 格式:$(content).appendTo(selector ...