java - 了解 JVM GC

标签 java performance garbage-collection jvm

我试图了解我下面编写的代码是如何工作和输出的。

public static void getRunTimeMemoryConsumption(){

List<Integer> array = new ArrayList<Integer>();
for(int i = 0 ; i < 100000 ; i++){
    array.add(i);
}

List<Integer> array1 = new ArrayList<Integer>();
for(int i = 0 ; i < 100 ; i++){
    array1.add(i);
}

Runtime rt = Runtime.getRuntime();

//Run the GC
rt.gc();

long memoryFreed = rt.totalMemory() - rt.freeMemory();
System.out.println("Memory freed in Mbytes :: " + memoryFreed/(1024));

}

当我运行此代码时,它总是为我提供 132 KB 作为输出(9/10 运行)。 但是,如果删除 rt.gc() 调用,我会在输出语句中释放更多内存 (>100 MB)。我如何理解 Java 运行时的这种行为?

最佳答案

我不完全确定您正在尝试什么。

您不是在计算释放了多少内存,而是在计算 rt.totalMemory() - rt.freeMemory() ,即使用了多少内存。考虑到这一点,您得到的结果很有意义,如果没有垃圾回收,则在 gc 之后会使用更多内存。要了解释放了多少内存,您应该比较 rt.totalMemory() - rt.freeMemory()在调用垃圾收集器之前和之后。

此外,您放入 for 循环列表中的整数不符合垃圾回收条件,因为它们是 Activity 对象(即列表)的引用。不确定什么是垃圾收集,因为我没有看到程序的其余部分,但您应该以某种方式修改您的测试,以便在垃圾收集时您拥有不被 Activity 对象引用的对象。

关于java - 了解 JVM GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14975723/

相关文章:

c++ - 从 GPU 大量传输到 RAM 后渲染缓慢?

java - 测量代码段的 Java 执行时间、内存使用情况和 CPU 负载

c# - Finalizer 没有被一次性类型对象调用

performance - JVM 收集时间是否随 JVM RAM 大小呈指数增长?

java - 使用DecimalFormat(强制点)和drawString()(y似乎是错误的)

java.lang.NoSuchFieldError : STANDARD_IMPORTS

java - 如何遍历 2 个单向 Ebean rels @ManyToOne 和 @OneToOne

java - 创建 Rest Web 服务以接收图像

java - (TeeChart - Java) 评估版性能问题

Python3 + ctypes回调在简单示例中导致内存泄漏