Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定java内存使用率_Java_Memory - Fatal编程技术网

确定java内存使用率

确定java内存使用率,java,memory,Java,Memory,嗯,Java内存使用方面有什么入门知识吗?我本以为Sun或IBM会有一篇关于这一主题的好文章,但我找不到任何真正可靠的东西。我想知道两件事: 在运行时,计算包中的类在给定时间使用的内存量 在设计时,评估各种事情的一般内存开销需求,如: 空对象需要多少内存开销(除了其字段所需的空间) 创建闭包时需要多少内存开销 像ArrayList这样的集合需要多少内存开销 我可能创建了数十万个对象,我想成为一个“好邻居”,不要过度浪费RAM。我的意思是,我真的不在乎我使用的内存是否比“最佳情况”多10%(不

嗯,Java内存使用方面有什么入门知识吗?我本以为Sun或IBM会有一篇关于这一主题的好文章,但我找不到任何真正可靠的东西。我想知道两件事:

  • 在运行时,计算包中的类在给定时间使用的内存量
  • 在设计时,评估各种事情的一般内存开销需求,如:
    • 空对象需要多少内存开销(除了其字段所需的空间)
    • 创建闭包时需要多少内存开销
    • 像ArrayList这样的集合需要多少内存开销
  • 我可能创建了数十万个对象,我想成为一个“好邻居”,不要过度浪费RAM。我的意思是,我真的不在乎我使用的内存是否比“最佳情况”多10%(不管是什么),但如果我实现的东西使用的内存是我做一个简单更改时所能使用的内存的5倍,我希望使用更少的内存(或者能够为固定的可用内存量创建更多的对象)

    我找到了几篇文章(还有一些文章)和一个内置类,它们声称可以测量内存使用的“近似值”(?),但这些看起来都有点模糊


    (是的,我意识到运行在两个不同操作系统上的JVM可能会对不同的对象使用不同的内存量)

    看看是否能满足您的需要。

    您可以使用,但它只适用于Java 1.5。

    这可能不是您想要的确切答案,但是下面链接的bost会给你很好的提示

    我相信Netbeans中包含的探查器也可以监视内存使用情况,您可以尝试一下我在几年前使用过的探查器,它做得很好,您可以将内存使用情况分解到相当精细的级别。

    从Java 5开始,在Hotspot和其他支持它的VM上,您可以使用Instrumentation接口向VM询问给定对象的内存使用情况。这很微妙,但你可以做到。 如果您想尝试这种方法,我已经在我的网站上添加了一个关于使用Instrumentation框架的页面

    作为32位机器上热点的粗略指南:

    • 对象使用8个字节用于 “客房管理”
    • 字段使用您希望它们使用的内容 使用给定的位长度(尽管布尔值往往被分配一个完整的字节)
    • 对象引用使用4个字节
    • 整体obejct大小有一个 8字节的粒度(即,如果 有一个具有1个布尔字段的对象 它将使用16个字节;如果您有 对象具有8个布尔值,它也将 使用16字节)
    就VM如何对待集合而言,集合没有什么特别之处。它们的内存使用量是它们内部字段的总和,再加上它们所包含的每个对象的使用量(如果你算上这个)。您需要考虑一些因素,比如ArrayList的默认数组大小,以及每当列表满时该大小将增加1.5的事实。但是,无论是询问虚拟机还是使用上述指标,查看集合的源代码并“完成”都会让您找到答案


    如果“闭包”是指可运行或可调用的对象,那么它和其他对象一样只是一个无聊的旧对象。(注意,它们不是真正的闭包!!)

    我已经多次使用新版本的Netbeans附带的,它工作得非常好,为您提供了大量有关内存使用和程序运行时的信息。绝对是一个很好的起点。

    如果您使用的是1.5版本之前的虚拟机,您可以通过使用序列化获得对象的大致大小。不过要注意。。这可能需要将该对象的内存量增加一倍。

    这看起来是一个分析CPU使用情况的好工具,但它是否也分析内存使用情况?我浏览了这篇文章&看起来不是这样。(清理旧的不可接受的问题:如果你能为我指出32位机器上热点对象使用的源代码,我会接受这一点,例如8字节用于内务管理+4字节用于objrefs+8字节粒度),这些有效地来自热点源代码中的结构,虽然它们是通过实际测量得到证实的。显然,这些数字只适用于32位版本。我承认,我不知道Java 7中是否有任何更改,尽管我认为没有。我在这里回答了基本相同的问题: