java - 如何在java中的堆上单独获取所有对象消耗的运行时内存

     2023-03-06     198

关键词:

【中文标题】java - 如何在java中的堆上单独获取所有对象消耗的运行时内存【英文标题】:How to get runtime memory consumed by all the objects individually on heap in java 【发布时间】:2013-08-16 07:16:44 【问题描述】:

我目前正在运行以下代码,这表明我的 java 应用程序正在使用近 5mb 的内存。但是我的 mac 的活动监视器说它使用 185 mb。额外的内存在哪里使用?即使我的应用处于空闲状态,我消耗的内存也在不断增加,从 5 mb 上升到 7 mb。

还有任何 java 类可以让我观察堆上的最新对象(所有对象分别)以及运行时的内存消耗吗?

  package profiling;

    public class MemConsumption 


        public static void profiling() 
            Runtime runtime = Runtime.getRuntime();
            long memory = runtime.totalMemory() - runtime.freeMemory();
            System.out.println("Used memory is bytes: " + memory);
            System.out.println("Used memory is megabytes: "
                    + bytesToMegabytes(memory));

        

        public static long bytesToMegabytes(long bytes) 
                final long MEGABYTE = 1024L * 1024L;//1024 kb of 1024 bytes

            return bytes / MEGABYTE;
        

    

【问题讨论】:

【参考方案1】:

我目前正在运行以下代码,这表明我的 java 应用程序正在使用近 5mb 的内存。

这是分配的 hep 数量,对象实际使用的数量可能会更小。

如果您想要更准确的记帐,您可以使用-XX:-UseTLAB,您将看到使用了多少字节。注意:多线程应用程序的速度要慢得多,但要准确得多。

但我的 Mac 的活动监视器显示它使用 185 mb。额外的内存在哪里使用?

很可能它会显示您正在使用多少虚拟内存,其中包括最大堆大小(堆的地址空间在启动时保留)和共享库、线程堆栈、perm gen ,直接内存,内存映射文件,例如字节缓冲区等

注意:虚拟内存不代表分配的内存量,并且是进程独有的。

即使我的应用处于空闲状态,我消耗的内存也在不断增加,从 5 mb 上升到 7 mb。

如果您没有真正做任何事情,您是如何确定堆大小的?监控应用程序使用一些堆。

还有任何 java 类可以让我观察堆上的最新对象(所有对象分别)以及运行时的内存消耗吗?

您需要转储堆并在 VisualVM 或商业分析器中查看它。

BTW MB = 兆字节,Mb = 兆位,mb = 毫位

【讨论】:

也许你还提到了直接内存使用 我只是打印使用的内存,检查行 - System.out.println("Used memory is bytes: " + memory); ,那为什么我的内存消耗越来越大? 当我尝试转储数据时,visualvm 说“无法在我的应用程序上堆转储”为什么?

两个或多个线程如何在它们分配的堆上共享内存?

】两个或多个线程如何在它们分配的堆上共享内存?【英文标题】:Howdotwoormorethreadssharememoryontheheapthattheyhaveallocated?【发布时间】:2012-08-0804:52:53【问题描述】:正如标题所说,两个或多个线程如何共享它们分配的堆上的内存?... 查看详情

java中的堆内存设置对线程创建数的影响以及-xss参数的记录

Java的线程对象是存储在堆上的,所以,能够创建多少个线程,受到堆空间的大小限制,同事也受到每个线程的大小的限制,假如线程对象内部有一个非常大的数组字段,那就非常影响能够创建的线程的大小我们的例子:classTaskimplementsRunnab... 查看详情

java中对象都是分配在堆上吗?你错了!

...对象并不一定分别在所认为的堆上。这两个点分别是Java中的逃逸分析和TLAB(ThreadLocalAllocationBuffer) 查看详情

均分纸牌

...堆上取若干张纸牌,然后移动。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为2的堆上;在编号为n的堆上取的纸牌,只能移到编号为n-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种... 查看详情

jvm-堆

Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的),堆是被所有线程共享的,在JVM中只有一个堆。所有对象实例以及数组都要在堆上分配内存,单随着JIT发展,栈上分配&#... 查看详情

jvmiz9是什么意思

...的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,... 查看详情

将数组分配到运行时已知大小的堆上

...堆中:intsize=1000;int*values=newint[size];delete[]values;我不知道如何在Rust中做同样的事情。letsize=1000;let 查看详情

获取视口java语言中的所有元素

...tr)而无需遍历每个元素?我发现了很多示例,这些示例如何检查指定元素是否在当前视口中,但是我需要的是一个函数返回当前视口中所有元素的列表。我需要此来进行虚拟化,因为此表应具有无限容量,并且从两百万行的每... 查看详情

在 cassandra-cli 中如何获取表中的所有列名以及如何在 java 中使用 hector 获取它?

】在cassandra-cli中如何获取表中的所有列名以及如何在java中使用hector获取它?【英文标题】:incassandra-clihowtogetallcolumnnamesinatableandhowtogetitusinghectorinjava?【发布时间】:2013-08-2419:41:01【问题描述】:我正在尝试获取列名,但无法仅... 查看详情

如何在 Pentaho 数据集成 (Kettle) 中的“用户定义的 Java 类”步骤中获取所有参数

】如何在Pentaho数据集成(Kettle)中的“用户定义的Java类”步骤中获取所有参数【英文标题】:HowtoFetchAllParametersin\'UserDefinedJavaClass\'StepinPentahoDataIntegration(Kettle)【发布时间】:2017-07-0707:47:29【问题描述】:场景:我正在PDI中创建一... 查看详情

如何在 Java 中查看堆中的内容?

】如何在Java中查看堆中的内容?【英文标题】:HowcanIseewhatisinmyheapinJava?【发布时间】:2008-09-2814:15:21【问题描述】:我已经设法在我正在开发的Java应用程序中发现内存“泄漏”。在运行我的JUnit测试套件时,我随机出现内存不... 查看详情

java的堆和栈

  在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分:     Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片... 查看详情

均分纸牌(noip2002)(代码片段)

...堆上取若干张纸牌,然后移动。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为2的堆上;在编号为n的堆上取的纸牌,只能移到编号为n-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种... 查看详情

1098均分纸牌

...移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。  现在要求找出一种移动方法,用最少的移动次数... 查看详情

1098均分纸牌

...移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。  现在要求找出一种移动方法,用最少的移动次数... 查看详情

java获取word中的所有插入和删除修订

在Word文档中启用跟踪更改功能后,会记录文档中的所有编辑行为,例如插入、删除、替换和格式更改。对插入或删除的内容,可通过本文中介绍的方法来获取。​​引入Jar​​​​方法1​​手动引入:将FreeSpire.DocforJava下载到... 查看详情

noip2002

...移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每... 查看详情

十分钟吃透java内存模型(代码片段)

...执行同样的代码,这两个线程任然在在自己的线程栈中的代码来创建局部变量。因此,每个线程拥有每个局部变量的独有版本。所有原始类型的局部变量都存放在线程栈上,因此对其它线程不可见。一个线程可能向另... 查看详情