理解java中的内存使用概念

理解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

我编写了一个用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=已用内存
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-你不应该那样考虑内存。。泛型只是编译时的障碍,可以防止您使用错误的类型。您的意思是创建列表与内存消耗无关吗?