如何通过一个对象实例,获得该实例目前在jvm占用内存大小?考虑到该实例可能具有String或者数组类型,java.lang.reflect应该不能解决。

解决方案 »

  1.   

    理论上是的。我只传入一个句柄,要得到该句柄对应的实例占用的jvm内存。 不知道有没有现成的包可以用?或者如何自己写代码来解决?
      

  2.   

    基本上很难
    因为至少API没有提供这样的方法
      

  3.   

    好像jdk1.5.0的JVMTI可以完成类似功能。不知道有没有人能来讲解一下,多谢:)
      

  4.   

    比较复杂,需要作对象实例遍历,也就是类似JVM的垃圾回收机制
      

  5.   

    推荐楼主看下王森的《Java深度历险》,里面有讲关于JVM及运行原理。
      

  6.   

    不知道,个能认为你说说的是不是指类似于 sizeof()的功能
    但不知道,你要这个有什么用,
      

  7.   

    用Borland Optimizeit Profiler 来作性能测试吧,超级强悍,不要说一个对象实例,
    整个程序的内存使用情况,内存释放情况,甚至那个函数的cpu使用时间片都一目了然,
    强烈推荐。
      

  8.   

    这个问题问的有点经典。
    原来还是真的没有去关心内存问题。
    只是知道jvm会自己搞定这些事情。
      

  9.   

    理论上是的。我只传入一个句柄,要得到该句柄对应的实例占用的jvm内存。 不知道有没有现成的包可以用?或者如何自己写代码来解决?关于这个问题,建议楼主看看这本书:《java virtual machine》
    这上面有比较详细的描述:
    3.4 Reference Types and Values
       There are three kinds of reference types: class types, array types, and interface types. Their values are references to dynamically created class instances, arrays, or class instances or arrays that implement interfaces, respectively. A reference value may also be the special null reference, a reference to no object, which will be denoted here by null. The null reference initially has no runtime type, but may be cast to any type (§2.4). 
    这本书也有中文版,个人感觉:很不错(如果想深入了解jvm的话)一个字通常都是主机平台的指针大小,在32位平台上,字是32位,指针是32位
      

  10.   

    如何通过一个对象实例,获得该实例目前在jvm占用内存大小?考虑到该实例可能具有String或者数组类型,java.lang.reflect应该不能解决。关于这个问题,String有点特殊,以前也有帖子讨论过创建几个String对象的问题,楼主可以查查看。
    String对象的值是一个个char值,它占用的内存空间是按照基本变量char来分配空间,关于数组,也特殊。它是根据数组声明是的类型以及数组的引用来分配的,例:声明了int [] i1 =  new int[]{1,2};
    类型分配就是按照int型初始化的,在这里分配空间是i1[0],i1[1]
      

  11.   

    再补充点
    上面的数组引用分配空间也就2个吧:i1[0],i1[1]以上资料来自《java virtual machine》
    希望对楼主有帮助
      

  12.   

    我看 WebSphere Profile  模式启动 可以看到 一个 Object 8 bytes, 如果包含一个 简单属性 就变成了 16 bytes. 比如一个 Integer 16.