运行时java对象在内存中是什么样子的?

翻译 2015年11月19日 18:00:46

我们知道函数在内存中作为一条栈的激活记录被实现,我们也知道java方法作为栈的一片被实现,java对象在堆中被分配。

java对象在堆中是什么样的呢,一旦一个对象被放入内存中,那么它就是一连串的byte。那么我们怎么去找特定的区域呢,在编译器内存保存一个内部表包含每一个区域的位移量。下边是一个类“Base”对象的例子,这个类没有任何方法,方法在内存中是如何铺放的,我们下一节会讲到。


如果我们有另一个类Derived,继承自Base类,内存中的样子如下:


子对象有和父对象相同的内存分布,另外它需要额外的空间安放新增加的字段。这种分布的好处是,在开始的时候类B的指针A指向D对象依旧可以看到B对象的内容。因此,通过B的引用在D上的操作是安全的,没有必要检查B动态的指向什么。这就解释了多态的实现的原理


但是这种方法没有效率,如果一个类有很多的方法,那么每一个对象必须有相应的指针集合,另外每一个对象需要为这些指针分配空间,这样对象的创建变的很慢并且导致对象很大。优化的方法是创建一个虚拟的函数表,包含了为特定的类的函数分配的指针的数组。


原文链接:http://www.programcreek.com/2011/11/what-do-java-objects-look-like-in-memory/

java对象在内存中的分配

ava中内存主要包含4块,即heap(堆内存)、stack(栈内存)、data segment(静态变量或是常量存放区)、codesegment(方法区).  堆内存中存放的是new出的对象,new...

Java对象创建过程和内存结构分析

JAVA内存分配和管理是JAVA的核心技术之一,在看了尚硅谷宋红康老师讲解的JAVA内存知识之后,结合《深入理解JVM这本书》对自己所学的知识进行简单的总结,写了这篇日志。 1.JAVA内存分区 ...

查看java对象占堆内存多少个字节

abstract class SizeOf {               private final Runtime s_runtime = Runtime.getRuntime();     ...

java对象的内存分配入口

一.GC策略检查        JVM在

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

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

JAVA 笔记(四) RTTI - 运行时类型检查

运行时类型检查,即Run-time Type Identification。这是Java语言里一个很强大的机制,那么它到底给我们的程序带来了什么样的好处呢? 在了解运行时类型检查之前,我们要首先知道...

Java 内存分配全面浅析

本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java。这类文章网上有很多,但大多比较零碎。本文从认知过程角度出发,将带给读者一个系统的介绍。 进入正题前首先要知道的是Java程...
  • shimiso
  • shimiso
  • 2013年02月20日 17:54
  • 76526

Java对象在内存中是如何存储的

原文地址:How are Java objects stored in memory?在Java中,所有的对象都被动态地分配在堆上。这与C++不同,C++的对象要么分配在栈中,要么分配在堆上。在C++...

Java数组在内存中是什么样的?

Java中的数组主要保存两项内容:基本类型数据(int,char,...),引用(也可以认为是指针)。 每当使用“new”关键字创建一个新的对象,内存就会在堆中为其分配一块新的空间,并返回对这...

Java 类中各成分加载顺序 和 内存中的存放位置

一、什么时候会加载类? 使用到类中的内容时加载:有三种情况 1.创建对象:new StaticCode(); 2.使用类中的静态成员:StaticCode.num=9;  StaticCode....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:运行时java对象在内存中是什么样子的?
举报原因:
原因补充:

(最多只允许输入30个字)