了解java中的内存使用概念

时间:2015-04-28 08:34:49

标签: 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 = 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 个答案:

答案 0 :(得分:5)

  
      
  1. 此输出的单位是什么(243919216 =已用内存)?
  2.   

long 值,提供字节数

  
      
  1. 应用程序的最佳消耗内存是多少?
  2.   

答案因应用程序而异。

  
      
  1. 这是检查内存使用情况的正确方法吗?
  2.   

不。这不能给你正确的答案。使用 profiler 获取此信息。您可能还希望将this.getApplicationContext(); mManager = (NotificationManager) this .getApplicationContext() .getSystemService( Context.NOTIFICATION_SERVICE); Intent intent1 = new Intent( this.getApplicationContext(), Activity_Mentor.class); // @SuppressWarnings("deprecation") Notification notification = new Notification( R.drawable.dpu_ic_launcher, "New Message", System.currentTimeMillis()); notification.number=notificationCount++; intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingNotificationIntent = PendingIntent .getActivity( this.getApplicationContext(), 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.setLatestEventInfo( this.getApplicationContext(), getStaffName, chatMessage, pendingNotificationIntent); int NOTIFY_ME_ID = Integer.parseInt(chatId); mManager.notify(NOTIFY_ME_ID, notification); 替换为maxMemory(),以使更接近到实际答案。

答案 1 :(得分:2)

Java使用TLAB(线程本地分配缓冲区)每个线程从公共池中获取大块内存,并从本地分配。阅读内存记帐时,您只能看到公共池的使用量。

通过在命令行上使用-XX:-UseTLAB禁用TLAB,可以更准确地查看内存使用情况。这将允许您按字节内存使用情况查看字节。

注意:这不会显示完整集合中将保留多少内存,您需要执行System.gc();以查看此内容,但您可以看到已使用了多少内存。

  

此输出的单位是什么(243919216 =已用内存)?

内存使用当然对少量有用,关闭TLAB会有所帮助。

  

应用程序的最佳消耗内存是多少?

最佳数量不是额外的内存,但这对于开发工作来说效率不高。通常浪费几美元的内存以节省几个小时的开发时间是有意义的。

  

这是检查内存使用情况的正确方法吗?

监视内存使用情况的最简单方法是使用内存分析器。这是最好的起点,因为这会查看整个应用程序,而不仅仅是您关注的内容。

答案 2 :(得分:1)

  • 单位为字节。

  • 应用程序没有&#34;最佳消耗内存&#34;。所有 应用程序是不同的。

  • 不,这不是检查内存使用情况的正确方法。这是什么 JMeterJVisualVM等分析器适用于。

答案 3 :(得分:0)

添加-verbose:gc参数此参数将在本机stderr文件或重定向控制台输出的文件上记录GC占用信息。删除现有文件,运行程序直到需要。在GCMV工具中加载文件以检查内存使用行为。

http://www.ibm.com/developerworks/java/jdk/tools/gcmv/