0

当我们定义一个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 的运行时内存使用情况呢?

4

2 回答 2

1

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

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

于 2018-09-13T04:26:58.593 回答
1

您可以像这样获取另一个 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());
   }
}

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

于 2018-09-13T05:34:08.220 回答