簡體   English   中英

監視Java應用程序自己的內存使用情況

[英]Monitoring own memory usage by Java application

我想在一個Java進程中運行幾個REST Web應用程序,以便在Akka的幫助下輕松保存內存和擴展。 我想估計每個請求處理程序消耗多少內存並檢測整個系統的這些內存。

  1. 是否有可能在該進程內幾乎實時監視內存使用情況,並找出每個請求處理程序使用了多少內存? 我需要實現的目標是什么? 有沒有工具?

  2. 是否有可能捕獲out of memory exception並基於內存使用情況做一些事情,例如僅崩潰請求處理程序超出假定的內存限制? 如果是這樣,可能會有什么不好的?

程序的總使用/可用內存可以通過java.lang.Runtime.getRuntime()在程序中獲得;

運行時有幾種與內存相關的方法。 以下編碼示例演示了其用法。

package test;

import java.util.ArrayList;
import java.util.List;

public class PerformanceTest {
  private static final long MEGABYTE = 1024L * 1024L;

  public static long bytesToMegabytes(long bytes) {
    return bytes / MEGABYTE;
  }

  public static void main(String[] args) {
    // I assume you will know how to create a object Person yourself...
    List<Person> list = new ArrayList<Person>();
    for (int i = 0; i <= 100000; i++) {
      list.add(new Person("Jim", "Knopf"));
    }
    // Get the Java runtime
    Runtime runtime = Runtime.getRuntime();
    // Run the garbage collector
    runtime.gc();
    // Calculate the used memory
    long memory = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("Used memory is bytes: " + memory);
    System.out.println("Used memory is megabytes: "
        + bytesToMegabytes(memory));
  }
} 

要回答您的第一個問題,您可以使用許多工具來監視內存使用情況,但是我不知道在“實際”時間內將內存使用情況映射到線程的任何應用程序。 在應用程序中,您可以使用MemoryMXBeanMemoryPoolMXBeans來監視內存使用情況,

回答你的第二個問題:不,不是真的。 除了捕獲OOME通常是一個壞主意之外,主要問題是接收異常的線程可能不是真正的罪魁禍首。 OOME被拋出到進行最終分配請求的線程上。 但是, 其他一些線程可能是填滿大部分內存的線程。 另一個問題是,由於OOME可能隨時被拋出,因此可能會將其拋入應用程序中的某些關鍵代碼中,使其處於殘缺狀態。 長話短說,當你收到OOME時,你幾乎總是希望重新啟動你的應用程序。

VisualVM是一個監控應用程序的好工具。 你可以嘗試一下: http//visualvm.java.net/

您還可以添加代碼語句來監視可用內存,如:

Runtime runtime = Runtime.getRuntime();
System.out.println("Free memory: " + runtime.freeMemory() + " bytes.");

無法處理此異常。 問題是,如果您在一個公共應用服務器(例如tomcat)中運行所有Web服務,那么如果存在“內存不足”異常,JVM將會關閉。 嘗試查看程序中是否存在任何內存泄漏或內存處理錯誤。 您可以在Netbeans或Eclipse中使用分析。 此外,使用“findbugs”或“sonar”等工具進行代碼分析可能會向您顯示代碼中可能存在的不良做法。

在任何情況下,使用有關垃圾收集或JVM內存的Java選項(如-Xmx)可以減少此類異常並提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM