首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java:类成员的内存是如何分配的?

java:类成员的内存是如何分配的?
EN

Stack Overflow用户
提问于 2010-11-11 22:17:00
回答 5查看 180关注 0票数 0

我们有一个大的类,有68个int,22个双成员,还有4个成员作为类。e.g

代码语言:javascript
运行
复制
Class A{

   public int i1

   public int i2

   public int i3

   ....

   public Order order1


   public Order order2

   ...

   public double..

}

1: i1、i2、i3的内存是物理连续的吗?

2:对于A类,它是存储指向order1 & order 2的指针,还是存储order 1& order 2的内容?

还有另一个类B,它有一个成员作为A的数组,有365个A。所以B的内存可能非常大。我担心的是,如果B的大小太大,我们可能会丢失很多二级缓存,从而降低性能。我们主要对i1的值求和,对i2的值求和,并对i3的值求和等。例如,如果对所有365 A的i1求和,那么所有365A的i1将不会持续驻留在内存中。因此,我们可能会命中某些缓存缺失,从而获得不好的性能。

我正在考虑使用类B,但删除类A,并将A中的所有元素移动到B,这样我们就可以获得

代码语言:javascript
运行
复制
Class B {

   public array_of_i1

   public array_of_i2
..

}

这样,当我计算i1或i2的总和时,所有的i1或i2都坐在一起,所以也许我们可以获得性能改进?

由于班级很大,我想在更改之前征求您的意见。

EN

回答 5

Stack Overflow用户

发布于 2010-11-11 22:22:04

它通常是连续的,但这取决于您使用的是哪个JVM。

Java的一个复杂之处在于,

对象的内存结构中的运行时不是由虚拟机规范强制执行的,这意味着虚拟机提供者可以随心所欲地实现它们。其结果是,您可以编写一个类,当在另一个VM中运行时,一个VM中该类的实例占用的内存量可能与同一个类的实例占用的内存量不同。

至于具体的布局,

为了节省一些内存,Sun不会按照声明对象属性的顺序排列这些属性。相反,属性在内存中按以下顺序组织:

  1. doubles and longs
  2. int and floats
  3. shorts and floats and floats

(来自http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html)

他还介绍了如何处理继承的类。

票数 3
EN

Stack Overflow用户

发布于 2010-11-11 22:24:29

JLS并没有严格指定对象的确切大小,因此这在不同的JVM实现中可能会有所不同(尽管您可以推断出一些下限,即一个整数必须至少为32位)。

然而,在Sun的JVM中,整数占用32位,双精度占用64位,对象引用占用32位(除非您在64位JVM上运行,并且禁用了指针压缩)。则对象本身具有2个字的标题,并且总的内存大小对齐为8字节的倍数。

因此,如果我没有忘记说明某些事情(这是完全可能的),并且如果您在32位计算机上运行,那么这个对象应该占用8 * ceil((8 + 68 * 4 + 22 * 8 + 4 * 4) / 8) = 10448字节。

-如上所述,你不应该过于依赖它,因为它没有在任何地方指定,并且在不同的实现和不同的平台上会有所不同。对于与性能相关的指标,关键是编写干净的代码,测量影响(在这种情况下,使用分析器查看内存使用情况和执行时间),然后根据需要进行优化。

只有从宏观的角度来看,性能才是真正重要的;在设计对象模型时担心L2缓存未命中确实是错误的做法。

(而且一个包含94个字段的类几乎肯定不是一个干净的设计,所以您可以考虑重构它……)

票数 3
EN

Stack Overflow用户

发布于 2010-11-11 22:22:37

首先,在你开始任何工作之前,你已经对你的申请进行了概要分析吗?缓存未命中是否会导致瓶颈?

您的性能要求是什么?(注意:“越快越好”不是要求*)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4155263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档