理解java中的内存使用概念
我编写了一个用java解析XML(SAX解析器)文件的小程序,只是为了检查我的程序消耗了多少内存。我在循环中添加了以下代码行理解java中的内存使用概念,java,memory,xml-parsing,runtime,Java,Memory,Xml Parsing,Runtime,我编写了一个用java解析XML(SAX解析器)文件的小程序,只是为了检查我的程序消耗了多少内存。我在循环中添加了以下代码行 System.out.println(Runtime.getRuntime().maxMemory()-Runtime.getRuntime().freeMemory()+" = used memory"); 我得到以下输出: <CATALOG> 243919216 = used memory <CD> 243919216 = use
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=已用内存
243919216=已用内存
243919216=已用内存
243919216=已用内存
243919216=已用内存
243919216=已用内存
243919216=已用内存
243919216=已用内存
由于我不熟悉这些记忆概念,我想知道:
- 此输出的单位是什么(243919216=已用内存)
- 应用程序的最佳内存消耗是多少
- 这是检查内存使用情况的正确方法吗
- 单位为字节
- 没有“应用程序的最佳内存消耗”。全部的 应用程序不同
- 不,这不是检查内存使用情况的正确方法。那是什么
诸如
和JMeter
之类的探查器是用于JVisualVM
- 此输出的单位是什么(243919216=已用内存) 它是一个给出字节数的长值
- 应用程序的最佳内存消耗是多少 答案因应用而异
- 这是检查内存使用情况的正确方法吗
没有。这并不能给你正确的答案。使用探查器获取此信息。您可能还希望将
maxMemory()
替换为totalMemory()
,以便更接近实际答案。添加-verbose:gc参数此参数将记录本机stderr文件或控制台输出重定向的文件上的gc占用信息。删除现有文件,运行程序直到需要。在GCMV工具中加载文件以检查内存使用行为
Java使用一个TLAB(线程本地分配缓冲区),每个线程从一个公共池中获取一大块内存,并从这个本地池进行分配。当您读取内存记帐时,您只能看到公共池正在使用多少内存
通过在命令行上使用-XX:-UseTLAB
禁用TLAB,可以更准确地查看内存使用情况。这将允许您逐个字节查看内存使用情况
注意:这不会显示完整集合将保留多少内存,您需要执行System.gc()
也可以看到这一点,但您可以看到使用了多少内存
此输出的单位是什么(243919216=已用内存)
内存使用量太大,对于少量内存来说没有用处,关闭TLAB会有所帮助
应用程序的最佳内存消耗是多少
最佳的内存量不是额外的内存,但这对于开发工作来说并不有效。通常,浪费几美元的内存来节省几个小时的开发时间是有道理的
这是检查内存使用情况的正确方法吗
监视内存使用情况的最简单方法是使用内存分析器。这是最好的开始,因为这将着眼于您的整个应用程序,而不仅仅是您关注的部分。如果使用ArrayList obj=new ArrayList()之类的语句,我会感到困惑;消耗更多的内存,这就是我想检查内存状态的原因。@SubhanAhmed-你不应该那样考虑内存。。泛型只是编译时的障碍,可以防止您使用错误的类型。您的意思是创建列表与内存消耗无关吗?