【问题标题】:How to judge a Java program's runtime memory usage dynamically?如何动态判断Java程序的运行时内存使用情况?
【发布时间】:2018-09-13 04:23:07
【问题描述】:

当我们定义一个Java类时,我们可以在堆中获取Obeject的内存使用情况,但是由于程序的未知行为,我们无法获取运行时内存使用情况。比如下面的类:

public class Sample{
   private int age;
   private String name;
   private static List scores = new ArrayList<Integer>();
   public static void main(String[] args){
     Scanner sc = new Scanner(System.in);
     while(sc.hasNext()){
       scores.add(sc.nextInt());
     }
   }
}

那我们如何获取Sample类的运行时内存使用情况?

【问题讨论】:

标签: java jvm jmx


【解决方案1】:

有多种工具可以做到这一点。您可以使用 JDK 中的 jvisualvm。或者,也有一些商业的。欲了解更多信息,您可以关注此link。此外,您可以在 jvisualvm 上安装“visual GC”插件,该插件会显示您在堆的不同部分进行更改,例如:Eden、survivers、old gen、metaspace。甚至执行 GC 的时间和加载类的时间也是可跟踪的。

从 Tools->plugins 在 jvisualvm 上安装插件。

【讨论】:

    【解决方案2】:

    您可以像这样获取另一个 java 参数,例如“已用内存”:

    public class Sample{
       private int age;
       private String name;
       private static List scores = new ArrayList<Integer>();
       public static void main(String[] args){
         Scanner sc = new Scanner(System.in);
         while(sc.hasNext()){
           scores.add(sc.nextInt());
         }
    
            Runtime runtime = Runtime.getRuntime();
    
            System.out.println("Used Memory:" 
                + (runtime.totalMemory() - runtime.freeMemory()));
    
            System.out.println("Free Memory:" 
                + runtime.freeMemory());
    
            System.out.println("Total Memory:" + runtime.totalMemory());
    
            System.out.println("Max Memory:" + runtime.maxMemory());
       }
    }
    

    如果你想计算一个类的使用情况,你必须在运行之前和之后获取这个参数而不是类并比较数字

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2012-11-12
      • 2011-09-20
      • 2011-03-09
      • 2015-05-25
      • 2010-10-02
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多