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

如何计算java对象的大小

阅读更多
是不是经常通过jvisualvm.exe来观察堆对象占用内存的变化?是不是在想oracle公司为啥不提供计算java对象大小的方法呢?
在企业开发中,前后台传递数据,如果数据比较大,进行持久化传递将会造成对象无法被虚拟机回收,进而导致内存泄漏,但一般是由于对象不较大引起的,因此需要对这些对象进行处理。google查询了一些资料,研究和整理如下:

1、利用序列化方法,这个经测试时比较接近的;
2、根据对象的大小进行估值;
3、使用虚拟机提供的函数,动态的,有时准确,有时不准确;
4、通过反射获取对象的大小,理论比较好,但没实现;
5、通过代理的方法来得到

下边主要说下序列化和虚拟机函数的方法。
序列化时通常把一个对象序列化到一个字节buffer里,那么就可以获得这个buffer的字节数。今天,在工作中,突软想到这样做太浪费空间,看了Java的ObjectOutputStream这个类的源码,发现也可以如下做,只计数,不产生字节转移,那么就不会耗费内存空间了。

  public final class SizeCalculator {

  public static int calcSize(java.io.Serializable o) {

  int ret = 0;

  class DumbOutputStream extends OutputStream {

  int count = 0;

  public void write(int b) throws IOException {

  count++; // 只计数,不产生字节转移

  }

  }

  DumbOutputStream buf = new DumbOutputStream();

  ObjectOutputStream os = null;

  try {

  os = new ObjectOutputStream(buf);

  os.writeObject(o);

  ret = buf.count;

  } catch (IOException e) {

  // No need handle this exception

  e.printStackTrace();

  ret = -1;

  } finally {

  try {

  os.close();

  } catch (Exception e) {

  }

  }

  return ret;

  }

  public static void main(String[] args){

  System.err.println(calcSize(1));

  }

  }
原文链接:http://www.linuxidc.com/Linux/2010-01/24222.htm

2、通过获取new对象前和后 Runtime.getRuntime().totalMemory( )计算它们的差值,还是有参考价值的,至于有的说先让虚拟机回收,这个不可行,因为虚拟机执行回收是自动的,并不能直接调用虚拟机进行对象回收的。  
分享到:
评论

相关推荐

    计算java对象大小

    总结来说,理解Java对象大小的计算对于优化内存使用、防止内存泄漏以及提高应用程序性能至关重要。开发人员需要了解不同方法的优缺点,并根据实际需求选择合适的方式。同时,应当注意,过于关注单个对象的大小可能...

    计算java对象的大小的方法

    本文将深入探讨如何计算Java对象的大小,以及这个知识点在实际开发中的应用。 首先,Java对象的大小不仅仅包括其字段的大小,还包括对象头(object header)的大小,对于HotSpot虚拟机,它包含了对齐填充、Mark ...

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

    为了计算对象大小,我们需要借助一些第三方库或者自行实现。 一个常见的第三方库是`DeepSizeOf`,它来自Eclipse Collections框架,提供了类似于C++中的`sizeof`操作。使用这个库,你可以很容易地计算出一个对象及其...

    测量Java对象大小的demo

    本示例“测量Java对象大小的demo”提供了一种方法,通过使用Java的`java.lang.instrument`包来注入`javaagent`,进而利用`Instrumentation`接口测量Java对象的精确内存占用。下面我们将详细探讨这一过程。 首先,`...

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

    总结起来,Java对象的内存大小计算涉及对象头、实例数据和对齐填充的综合考虑。通过`Unsafe`类或`Instrumentation`接口,我们可以获取这些组成部分的具体大小,进而了解一个Java对象在内存中的占用情况。这样的知识...

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

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

    java 对象 内存 大小

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

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

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

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

    首先,`SizeOf.java`可能是一个实现自定义内存大小计算的类。在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等语言那样简单。通常,我们可以使用一些工具或API来帮助我们。例如,`sun.misc....

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

    本文将深入探讨Java中的对象内存占用,以及如何使用"java-sizeof-0.0.4"工具来查看Java对象在内存中的大小。 在Java中,内存主要分为堆内存(Heap)和栈内存(Stack)。对象通常存储在堆内存中,而基本类型的变量和...

    java SizeOf 对象的大小

    NULL 博文链接:https://spice.iteye.com/blog/1104340

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

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

    Java对象池实现源码

    本篇文章将深入探讨Java对象池的实现原理,以及如何借鉴"Jakarta Commons Pool"组件来设计一个轻量级的对象池。 一、对象池的基本概念 对象池的基本工作流程包括以下几个步骤: 1. 初始化:预创建一定数量的对象并...

    java对象创建过程

    ### Java对象创建过程详解 在Java编程语言中,对象是程序的基本单元,一切皆对象这一概念使得Java在面向对象编程领域具有重要的地位。本文将详细阐述Java对象的创建过程,帮助读者深入理解Java基础。 #### 一、类...

    [Java拾遗]Java对象大小探究

    NULL 博文链接:https://langyu.iteye.com/blog/1167581

    JAVA对象以及数据的工具类

    本篇文章将深入探讨Java中的对象、基础类型以及数据处理相关的工具类。 首先,让我们关注Java中的基础类型。Java有八种原始数据类型:byte、short、int、long、float、double、char和boolean。为了方便处理这些类型...

    Java 面向对象 练习题与答案

    Java 面向对象编程练习题与答案 本资源摘要信息涵盖了 Java 面向对象编程的多个知识点,包括 Font 类、Toolkit 类、包机制、抽象类、数组操作等。 1. Font 类: Font 类是 Java 中的一个类,用于设置程序中的字体...

    Java对象内存布局 - 小分析

    本篇文章将深入探讨Java对象在JVM内存中的布局,帮助我们理解JVM是如何存储和管理对象的。 首先,我们要知道JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是Java对象的主要存储区域,所有通过`new`...

    【小知识】第4期 Java对象大小怎么算

    【小知识】第4期_Java对象大小怎么算

Global site tag (gtag.js) - Google Analytics