`

Java对象访问

    博客分类:
  • JVM
 
阅读更多

Java 语言中,对象访问是如何进行的?对象访问在Java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及Java 栈、Java 堆、方法区这三个最重要内存区域之间的关联关系,如下面的这句代码:

Object obj = new Object();  

  假设这句代码出现在方法体中,那“Object obj”这部分的语义将会反映到Java栈的本地变量表中,作为一个reference 类型数据出现。而“new Object()”这部分的语义将会反映到Java堆中,形成一块存储了Object 类型所有实例数据值(Instance Data,对象中各个实例字段的数据)的结构化内存,根据具体类型以及虚拟机实现的对象内存布局(Object Memory Layout)的不同,这块内存的长度是不固定的。另外,Java堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。由于reference类型在Java 虚拟机规范里面只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到Java堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:使用句柄和直接指针。

  • 如果使用句柄访问方式,Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息,如下图所示:

  • 如果使用直接指针访问方式,Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址,如下图所示:

这两种对象的访问方式各有优势,使用句柄访问方式的最大好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改使用直接指针访问方式的最大好处就是速度更快,它节省了一次指针定位的时间开销,由于对象的访问在Java中非常频繁,因此这类开销积少成多后也是一项非常可观的执行成本。就本书讨论的主要虚拟机Sun HotSpot而言,它是使用第二种方式进行对象访问的,但从整个软件开发的范围来看,各种语言和框架使用句柄来访问的情况也十分常见。
 

  • 大小: 40.1 KB
  • 大小: 32.7 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java 对象 内存 大小

    当我们谈论“Java对象内存大小”时,我们通常指的是一个Java对象在内存中占据的空间,包括对象头、实例字段以及可能的对齐填充。这个知识点对于开发高效缓存系统尤其重要,因为缓存需要精确管理内存来最大化存储效率...

    Java面向对象程序设计

    Java面向对象程序设计是计算机编程领域中的核心主题,它基于面向对象编程(OOP)理念,使得代码更具有模块化、可复用性和易于维护的特点。以下是对标题和描述中涉及的知识点的详细阐述: 1. **第1章:Java入门** -...

    flex访问java对象

    根据给定的信息,本文将详细解释如何通过Flex访问Java对象,并提供一个具体示例来帮助理解整个过程。本文主要分为以下几个部分:环境搭建、Java类编写、配置文件编写、Flex应用编写以及最终运行效果。 ### 一、环境...

    jni对象获取,使用jni从c++里获取Java对象

    这个指针提供了许多函数,用于操作Java对象、调用Java方法和访问Java字段。 4. **获取Java对象** 要从C++中获取Java对象,首先需要有该对象的局部引用(Local Reference)。可以通过`JNIEnv`的`GetObjectClass()`...

    JAVA对象模块.rar

    Java对象模块是Java编程中的核心概念,它代表了程序中的数据和行为的组合。在Java中,对象是类的实例,而类则是对象的蓝图。理解这一模块的关键在于掌握类、对象、属性和方法等基本概念。 1. 类(Class): 类是...

    Java中对象与引用

    ### Java中对象与引用 在Java编程中,深入理解对象与引用的概念对于掌握面向对象编程至关重要。本文将从以下几个方面详细解析对象与引用的基本概念及其相互间的关系。 #### 一、对象与引用的基础概念 **对象**: ...

    JAVA类与对象及数组习题

    JAVA类与对象及数组习题 JAVA类和对象及数组是JAVA编程语言的基础概念。下面是关于JAVA类和对象及数组的习题,涵盖了构造方法、继承、多重继承、变量声明、数组初始化等方面的知识点。 1. 构造方法的调用方式: ...

    Java面向对象程序设计课后答案全解

    Java面向对象程序设计是计算机科学中的一个重要领域,它基于面向对象编程(OOP)原则,为开发者提供了构建复杂软件系统的方法。本资源包含了该课程所有章节的课后习题答案,帮助学习者深入理解Java语言的面向对象...

    用java访问domino对象

    访问 Domino 对象使用 Java 本文主要介绍了使用 Java 访问 Domino 对象的基本编程方法。Domino 对象包括数据库、视图、文档等,可以通过 Java 程序来访问和操作。 首先,需要了解 Java 对 Domino 对象的访问是通过...

    Java面向对象应用程序开发

    Java面向对象应用程序开发是软件开发领域中的核心主题,尤其对于初学者和专业开发者而言,理解并掌握这一技术至关重要。Java语言以其强大的面向对象特性、跨平台兼容性以及丰富的类库,成为了开发各种类型应用程序的...

    java 子类对象赋值给父类对象的使用

    通过以上讨论,我们可以看到,Java中子类对象赋值给父类对象是一种强大且灵活的设计模式,它允许我们在代码中使用抽象的父类引用,从而简化编程,增加代码的通用性和可维护性。在实际项目中,合理利用这一特性,能够...

    java实例化对象的过程

    在Java编程语言中,实例化对象是创建类的实例,使其具有特定状态和行为的过程。这个过程涉及到几个关键步骤,让我们深入探讨一下。 首先,我们需要一个类,它是创建对象的蓝图。在Java中,我们使用`class`关键字来...

    Java面向对象程序设计+源代码+课后习题答案)

    Java通过访问修饰符(如public, private, protected)实现封装,以保护数据的安全性。 3. 继承:继承允许一个类(子类)从另一个类(父类)继承特性,减少代码重复,提高代码复用。Java中的继承使用`extends`关键字...

    java课件面向对象

    在Java面向对象编程中,理解抽象、封装和类的设计是构建清晰、可维护和可扩展程序的基础。本文将详细探讨这些概念以及它们在Java语言中的实现。 首先,抽象是从具体的实例中提炼出共性,形成一般化概念的过程。在...

    Java反射机制,通过对象访问调用类的私有成员或方法

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这一机制的核心在于,Java程序可以获取到关于任何类的内部信息,包括类名、属性、方法、构造器等,并能在运行时...

    Java面向对象程序设计(第二版)

    不过,我可以基于《Java面向对象程序设计(第二版)》这个标题和标签,来详细说明Java面向对象程序设计中可能涵盖的知识点。 在深入介绍之前,首先需要明确面向对象程序设计(OOP)是一种编程范式,它使用“对象”...

    《Java面向对象程序设计(第2版)》课件

    - 数据库访问:Java的JDBC API允许开发者以面向对象的方式操作数据库,简化数据存取过程。 综上所述,《Java面向对象程序设计(第2版)》课件涵盖了Java编程的核心内容,通过学习,开发者不仅能掌握Java语法,还能...

    JAVA面向对象程序设计(期末考试试题及答案).zip

    在Java编程语言中,面向对象程序设计(Object-Oriented Programming, OOP)是一种核心的编程范式,它基于“对象”概念,将数据和处理数据的方法封装在一起,以实现代码的模块化和可重用性。这个压缩包文件"JAVA面向...

Global site tag (gtag.js) - Google Analytics