`
329937021
  • 浏览: 124669 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java对象占内存大小

阅读更多
空对象占8个字节
有数据成员的话,你把数据成员按基本数据类型和对象引用分开统计。
基本数据类型按byte/boolean=1,char/short=2,int/float=4,long/double=8,累加,然后对齐到8的倍数。
对象引用按每个4字节,累加,然后对齐到8个字节的倍数。
=============
对象占用字节数=基本的8字节+基本数据类型所占的+对象引用所占的

比如
class A{
int a;
char b;
}
占 8(基本)+8(int 4+char 2=6,对齐到8)= 16个字节
再比如:
class B{
Integer a;
long b;
byte c;
}
占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节

===============
如果你是从别的类继承的,父类的也要算上。

这与C++不同,C++中,空对象占一个字节,有数据成员则按数据成员对齐后,得到的大小

#include <iostream.h>
class A
{
private:
int i;
    char b;
};

void main()
{
A a;
cout<<sizeof(a)<<endl;
}

得到的是8
分享到:
评论
3 楼 iliveido 2011-09-09  
liuxinglanyue 写道
“占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节 ”
这句有问题吧,jvm分配内存是按照 8byte 的倍数来分配的,
class B{
Integer a;
long b;
byte c;
}
大小为:空对象大小(8byte)+long大小(8byte)+byte大小(1byte)+空Integer引用的大小(4byte)=21byte
由于要是 8byte 的倍数,所以是 24byte
可以参照这个程序,把Te类改动一下,结果运行如下:

'before' heap: 143560, 'after' heap: 143584
heap delta: 24
size = 24 bytes


按照这篇文章的阐述http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html,博主确实是错的。因为引用变量的首地址也是要按4字节对齐的,所以,应该是8+8+1+3(对齐)+4 =24。补充一点,由于24刚好被8整除,所以不用再填充字节。
2 楼 liuxinglanyue 2010-12-30  
“占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节 ”
这句有问题吧,jvm分配内存是按照 8byte 的倍数来分配的,
class B{
Integer a;
long b;
byte c;
}
大小为:空对象大小(8byte)+long大小(8byte)+byte大小(1byte)+空Integer引用的大小(4byte)=21byte
由于要是 8byte 的倍数,所以是 24byte
可以参照这个程序,把Te类改动一下,结果运行如下:

'before' heap: 143560, 'after' heap: 143584
heap delta: 24
size = 24 bytes
1 楼 hoszb 2010-09-05  
sun的32位虚拟机,空对象是8字节
sun的64为虚拟机,空对象是16字节
jrockit的32位和64为虚拟机,空对象都是8字节

相关推荐

    测试java对象占用内存大小的例子

    本示例主要探讨如何测试Java对象占用的内存大小,以便更好地理解内存使用情况。 首先,`SizeOf.java`可能是一个实现自定义内存大小计算的类。在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等...

    JAVA对象所占内存大小计算例子

    首先,我们需要理解Java对象内存占用的基本原理。每个Java对象都由三部分组成:对象头(Object Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含对象引用和类型信息,实例数据是对象实际存储...

    java 对象 内存 大小

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

    java-sizeof-0.0.4:一个查看java对象占用内存大小

    "java-sizeof-0.0.4"是一个用于分析Java对象内存占用的工具,它可以帮助开发者更好地理解对象在运行时的内存消耗。这个工具提供了查看对象实例大小的能力,这对于调试和性能优化非常有用。"java-sizeof-0.0.4"包含三...

    统计缓存(java对象所占的内存)大小

    本文将深入探讨如何统计缓存(尤其是Java对象)所占的内存大小,以及这对理解程序内存消耗的重要性。 首先,我们要知道Java对象的内存开销主要由三部分组成:对象头、实例数据和对齐填充。对象头包含对象的类型信息...

    计算一个Java对象占用字节数的方法

    本篇文章将深入探讨如何计算Java对象占用的内存字节数,以及影响这一数值的因素。 首先,Java对象在堆内存中由四个部分组成:对象头(A)、基本类型域(B)、引用类型域(C)和填充物(D)。 **对象头(A)**: ...

    计算java对象大小

    这篇博客文章可能探讨了如何通过不同的工具和技术来估算Java对象在内存中的占用空间。 首先,Java对象的大小不是固定不变的,它取决于对象的类结构,包括类中的属性数量、类型以及虚拟机的实现。每个对象都会有一个...

    Java内存使用系列一Java对象的内存占用Java开发J

    这个“Java内存使用系列一Java对象的内存占用”主题旨在深入探讨Java对象在内存中的表现,以及如何有效地管理这些资源。Java开发人员需要理解内存分配、垃圾回收机制以及如何避免内存泄漏,以确保程序的高效运行。 ...

    Java对象内存布局 - 小分析

    在Java世界中,JVM(Java虚拟机)是运行Java应用程序的关键组件。它负责解析字节码、管理内存以及执行程序。...通过运行这些脚本,我们可以获取更具体的对象内存占用信息,进一步优化我们的Java应用。

    Java 对象(数组)占多大空间(几个字节) 手把手做实验

    总之,Java对象和数组的内存占用取决于JVM的配置、对象的字段、数组的元素类型和长度等因素。开启或关闭压缩选项会影响对象和数组引用的大小,进而影响整体的内存占用。对于内存优化和性能调优来说,了解这些细节至...

    Java占用内存的研究.pdf

    例如,对象的内存大小总是8的倍数,这意味着即使一个对象的理论内存大小是41字节,它仍然会占用48字节的内存空间,因为JVM会进行向上对齐。 总结而言,本文档提供了一个深入的分析,帮助读者理解在Java编程中,不同...

    java 对象在内存中的结构

    堆是 Java 程序员第二常用的存储区域,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java 的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。堆...

    java 通过sizeOf计算一个对象的大小

    在Java编程语言中,了解一个对象的内存大小是很有用的,特别是在性能调优和内存管理方面。`sizeOf`通常是指用来计算对象在内存中占用空间的一种方法。本篇文章将探讨如何通过Java来实现这样的功能,以及相关知识点。...

    java内存对象分配过程研究

    ### Java内存对象分配过程研究 #### 一、引言 Java作为一门强大的面向对象编程语言,在实际开发过程中,对象的创建及其内存管理是至关重要的环节。深入理解对象在内存中的分配过程不仅能够帮助开发者设计出更为...

    java字符串内存计算

    在Java中,直接获取一个对象所占用的内存大小并非易事。常见的做法是在运行特定代码之前记录当前的内存状态,待代码执行完成后,触发垃圾回收机制,并再次记录内存状态。通过对比两次内存状态的变化,可以估算出代码...

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    本文介绍了在Java多线程环境下减少内存占用量的一些关键策略,包括线程生命周期管理、对象生命周期设计、同步机制选择、线程池的使用和线程数量控制。同时,代码的异常处理和JVM参数调优也是提升多线程应用性能的...

    java实现内存动态分配

    Java的垃圾回收机制(Garbage Collection, GC)负责自动回收不再使用的对象所占用的堆内存。当一个对象不再有引用指向它时,该对象成为垃圾,GC会在适当的时候将其回收,释放内存。在实验中,虽然没有直接涉及垃圾...

    JAVA内存溢出问题总结

    8、程序里不可避免大量使用字符串处理,避免使用 String,应大量使用StringBuffer,每一个 String 对象都得独立占用内存一块区域。 在使用字符串时,应该避免使用 String,而应该使用 StringBuffer,以免内存溢出。...

    10Java对象的内存布局1

    Java对象的内存布局是Java虚拟机(JVM)中至关重要的一部分,它涉及到对象创建、内存分配以及对象访问等核心概念。在Java程序中,我们通常使用`new`关键字创建对象,但这只是表面操作,背后涉及的内存管理和构造器...

    计算java对象的大小的方法

    首先,Java对象的大小不仅仅包括其字段的大小,还包括对象头(object header)的大小,对于HotSpot虚拟机,它包含了对齐填充、Mark Word、Klass Pointer等部分。此外,如果对象是数组,还需要考虑数组长度字段。理解...

Global site tag (gtag.js) - Google Analytics