当前位置: 首页 > 面试题库 >

Java中的类的内存分配?

微生良策
2023-03-14
问题内容

类B继承了类A。现在,当我们创建类型B的对象时,为B分配的内存是多少?是否包括A和B或任何其他内存分配过程?


问题答案:

当创建对象B时,假设调用了默认构造函数

B myObject = new B();

然后,JVM分配具有更多或更少内容的对象:

  • 在B中显式声明的每个字段都有足够的内存(每个字段通常大约4-8字节,但是类型和主机系统之间有很大差异)
  • 对于A及其祖先继承的每个最终字段,都有足够的内存
  • 足够的内存来包含对调度向量的引用(也应约为4-8个字节)

编译器使用调度向量来存储可以在给定对象上调用的每个方法的地址,并且它取决于对象的类,而不是对象本身的实例(毕竟,每个对象B都具有相同的接口!)

因此,您不需要分配A,因为没有单独的对象A。您没有实例化2个单独的对象。创建B时,您正在创建A
..的“专业”版本,可以将其视为A并添加更多内容。因此,仅需要分配B(但请记住,B还具有其祖先拥有的一切)



 类似资料:
  • 我有一个关于java如何处理未使用变量的问题。 假设我有以下代码: 那么我就不会在代码中使用notUsedVariable。该变量是否会被存储,或者java是否足够聪明,可以在编译时忽略该变量? 谢谢

  • 问题内容: 使用以下Java选项启动Apache Tomcat(Atlassian Confluence)实例: 但是,我看到启动后,它很快就耗尽了虚拟服务器上可用的1GB内存中的大部分。 总消耗的内存(堆+ PermGen)是否不应该保持在使用- Xmx指定的值以下?这引起的问题之一是我无法使用关闭脚本关闭服务器,因为它试图生成具有256MB内存的JVM,该JVM因不可用而失败。 问题答案: T

  • 我有一个一直在思考的问题。以这个特殊的类为例 假设我有一个B类,它拥有一个使用listOne读取详细信息的方法。要查看数组列表,我需要首先获取列表的大小,以便我的代码知道数组列表何时结束。有两种方法可以做到这一点,一种是 或者我也可以用 在内存和效率方面,哪种方法更好?此外,假设我正在递归地读取一个非常大的数组。为了简单起见,让我们假设递归读取此数组将导致堆栈溢出异常。在这种情况下,第一个方法在理

  • 问题内容: 如果您运行的代码调用Java中的本机库,那么当内存分配应在对象的生存期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。 我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装了已编译的OpenCL内核及其所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法,您可以调用该

  • 我想知道如何确定java分配的内存。我有一个内存要求有限的程序。当我分配一个具有特定大小的数组时,我注意到JVM分配的内存是这个大小的两倍: 例如:在分配数组之前: 此行后:char[]xxx=新char[4*1024*1024]; 因此,可用内存量从14 MB降至6 MB。即使我的阵列只有4 MB。我尝试过不同的东西数组,总是一样的。为什么java分配的数组大小是原来的两倍? 谢谢

  • 我有一个非常消耗内存的程序,想使用-Xmx2048m为java jvm分配更多的最大内存。但在启动时,我得到一个“无法为对象堆保留足够的空间”错误。 当尝试多个值并发现我的最大值是时,它就开始了。但我喜欢分配2GB。在使用-Xmx1560m启动java进程后,我有6GB的物理内存,Taskmanager显示3400MB可用。 有人知道我为什么不能分配2GB吗?