运行时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千百问_07JVM架构(007)_java堆内存是什么样的

点击进入_更多_Java千百问1.堆内存是什么样的了解jvm实例模型看这里:jvm实例的结构是什么样的 了解java内存框架看这里:jvm是如何管理内存的 了解堆栈的区别看这里:java堆和栈有什...
  • ooppookid
  • ooppookid
  • 2016年05月22日 21:36
  • 2652

Java中堆和栈创建对象的区别

栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、ne...
  • liu_yujie2011com
  • liu_yujie2011com
  • 2016年08月29日 16:23
  • 1701

Java中对象都是分配在堆上吗?你错了!

我们在学习使用Java的过程中,一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中new出来的对象并不一定分别在...
  • rickiyeat
  • rickiyeat
  • 2017年08月07日 09:14
  • 4585

关于Java对象在内存中的状态和对象的引用的类型

一、关于垃圾回收机制的一些特性: 1、垃圾回收只负责回收内存中的对象,而不会回收任何物理资源。 2、程序无法精确控制垃圾回收动作的具体发生时间,垃圾回收只有在内存不足或程序处于空闲...
  • aliz13
  • aliz13
  • 2017年04月17日 10:29
  • 271

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

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

JAVA-堆区,栈区,方法区。

堆区: 村线程操纵的数据(对象形式存放) 1 存储的全部是对象,每个对象包含一个与之对应的class信息--class的目的是得到操作指令 2 jvm只有一个堆区(heap)被所有线...
  • wangxin1982314
  • wangxin1982314
  • 2015年12月14日 12:35
  • 4935

java中堆栈(stack)和堆(heap)

以往学习中的一个模糊点: java中堆栈(stack)和堆(heap)一、堆栈(stack)和堆(heap)?(1)内存分配的策略  按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,...
  • jerryao
  • jerryao
  • 2006年07月04日 10:57
  • 10614

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

原文地址:How are Java objects stored in memory?在Java中,所有的对象都被动态地分配在堆上。这与C++不同,C++的对象要么分配在栈中,要么分配在堆上。在C++...
  • sinat_36246371
  • sinat_36246371
  • 2016年11月26日 21:53
  • 683

java对象在内存中的分配

ava中内存主要包含4块,即heap(堆内存)、stack(栈内存)、data segment(静态变量或是常量存放区)、codesegment(方法区).  堆内存中存放的是new出的对象,new...
  • qq_30753945
  • qq_30753945
  • 2017年02月10日 22:45
  • 2611

Java堆空间:它是什么?

原文:https://javaeesupportpatterns.blogspot.com.ar/2012/02/java-heap-space-what-is-it.html翻译:刘志鹏本文将为您提...
  • b644ROfP20z37485O35M
  • b644ROfP20z37485O35M
  • 2017年12月13日 00:00
  • 120
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:运行时java对象在内存中是什么样子的?
举报原因:
原因补充:

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