我编写了一个小程序来解析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=已用内存)?
应用程序的最佳内存消耗是多少?
这是检查内存使用情况的正确方法吗?
4条答案
按热度按时间eh57zj3b1#
这个输出的单位是什么(243919216=已用内存)?
它是一个给出字节数的长值
应用程序的最佳内存消耗是多少?
答案因人而异。
这是检查内存使用情况的正确方法吗?
不。这并不能给你正确的答案。使用探查器获取此信息。您可能还需要替换
maxMemory()
与totalMemory()
更接近实际答案。ttisahbt2#
java使用一个tlab(threadlocalallocation buffer,线程本地分配缓冲区),每个线程从一个公共池中获取一大块内存,并从这个池本地分配。读取内存记帐时,只能看到公共池正在使用多少内存。
通过使用禁用tlab,可以更准确地查看内存使用情况
-XX:-UseTLAB
在命令行上。这将允许您逐个字节查看内存使用情况。注意:这不会显示完整集合将保留多少内存,您需要
System.gc();
也可以看到这个,但你可以看到多少内存已被使用。这个输出的单位是什么(243919216=已用内存)?
内存使用量太大,对于少量的内存是没有用的,关闭tlab会有帮助的。
应用程序的最佳内存消耗是多少?
最佳的内存量不是额外的内存,但是这对于开发工作来说是无效的。通常,浪费几美元的内存来节省几个小时的开发时间是有意义的。
这是检查内存使用情况的正确方法吗?
监视内存使用情况的最简单方法是使用内存探查器。这是最好的开始,因为这将着眼于您的整个应用程序,而不仅仅是您所关注的部分。
egmofgnx3#
单位是字节。
没有“应用程序的最佳内存消耗”。所有的应用程序都是不同的。
不,这不是检查内存使用情况的正确方法。这就是像这样的剖析者
JMeter
以及JVisualVM
是给你的。czfnxgou4#
添加-verbose:gc argument 此参数将记录本机stderr文件或控制台输出被重定向的文件上的gc占用信息。删除现有文件,运行程序直到需要。在gcmv工具中加载文件以检查内存使用行为。
http://www.ibm.com/developerworks/java/jdk/tools/gcmv/