理解java中的内存使用概念

2o7dmzc5  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(240)

我编写了一个小程序来解析java中的xml(sax解析器)文件,只是为了检查我的程序占用了多少内存。我在循环中添加了以下代码行。

System.out.println(Runtime.getRuntime().maxMemory()-Runtime.getRuntime().freeMemory()+" = used memory");

我得到以下输出:

<CATALOG>
243919216 = used memory
    <CD>
243919216 = used memory
      <TITLE>
243919216 = used memory
      <ARTIST>
243919216 = used memory
      <COUNTRY>
243919216 = used memory
      <COMPANY>
243919216 = used memory
      <PRICE>
243919216 = used memory
      <YEAR>
243919216 = used memory

由于我对这些记忆概念不熟悉,我想知道:
这个输出的单位是什么(243919216=已用内存)?
应用程序的最佳内存消耗是多少?
这是检查内存使用情况的正确方法吗?

eh57zj3b

eh57zj3b1#

这个输出的单位是什么(243919216=已用内存)?
它是一个给出字节数的长值
应用程序的最佳内存消耗是多少?
答案因人而异。
这是检查内存使用情况的正确方法吗?
不。这并不能给你正确的答案。使用探查器获取此信息。您可能还需要替换 maxMemory()totalMemory() 更接近实际答案。

ttisahbt

ttisahbt2#

java使用一个tlab(threadlocalallocation buffer,线程本地分配缓冲区),每个线程从一个公共池中获取一大块内存,并从这个池本地分配。读取内存记帐时,只能看到公共池正在使用多少内存。
通过使用禁用tlab,可以更准确地查看内存使用情况 -XX:-UseTLAB 在命令行上。这将允许您逐个字节查看内存使用情况。
注意:这不会显示完整集合将保留多少内存,您需要 System.gc(); 也可以看到这个,但你可以看到多少内存已被使用。
这个输出的单位是什么(243919216=已用内存)?
内存使用量太大,对于少量的内存是没有用的,关闭tlab会有帮助的。
应用程序的最佳内存消耗是多少?
最佳的内存量不是额外的内存,但是这对于开发工作来说是无效的。通常,浪费几美元的内存来节省几个小时的开发时间是有意义的。
这是检查内存使用情况的正确方法吗?
监视内存使用情况的最简单方法是使用内存探查器。这是最好的开始,因为这将着眼于您的整个应用程序,而不仅仅是您所关注的部分。

egmofgnx

egmofgnx3#

单位是字节。
没有“应用程序的最佳内存消耗”。所有的应用程序都是不同的。
不,这不是检查内存使用情况的正确方法。这就是像这样的剖析者 JMeter 以及 JVisualVM 是给你的。

czfnxgou

czfnxgou4#

添加-verbose:gc argument 此参数将记录本机stderr文件或控制台输出被重定向的文件上的gc占用信息。删除现有文件,运行程序直到需要。在gcmv工具中加载文件以检查内存使用行为。
http://www.ibm.com/developerworks/java/jdk/tools/gcmv/

相关问题