java - 在发生 OutOfMemoryError 错误之前对对象进行计数 (Java)

标签 java garbage-collection out-of-memory

我是编程初学者,我尝试通过使用 4 种类型的键运行下面的代码来比较不同类型的 GC。

public class User {

    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("Finalized.");
    }

    public static void showInfo() {
        Runtime runtime = Runtime.getRuntime();
        System.out.println("##### Heap utilization statistics [bytes] #####");
        System.out.println("Used memory: " + (runtime.totalMemory() - runtime.freeMemory()) + " bytes");
        System.out.println("Free memory: " + runtime.freeMemory() + " bytes");
        System.out.println("Total memory: " + (runtime.totalMemory()) + " bytes");
        System.out.println("Max memory: " + (runtime.maxMemory()) + " bytes");
    }

    public static void main(String[] args) {
        int num = 0;
        System.out.println("Start...");
        for (int i = 0; i < 54000; i++) {
            num++;
            new User("Bob", 25);
        }
        System.out.println("Objects created before error: " + num);
        showInfo();
        System.out.println("Finish.");
    }
}

键是(每个代表一种 GC 类型):

-XX:+UseSerialGC
-XX:+UseParallelOldGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC

我使用的是一个 3mb 的小堆 (-Xmx3mb)。

那么,问题是如何计算 OutOfMemoryError 之前(Java 堆空间错误之前)创建的对象数量?我的意思是,在该代码中创建的对象数量为 54000,但如果我尝试创建更多对象(70000、80000 等),则会出现错误,并且不知道在多少个对象之后抛出异常。有没有一个好的方法来计算在 OutOfMemoryError 之前我们可以创建多少个对象?

最佳答案

public static void main(String[] args) {
        int num = 0;
        System.out.println("Start...");
        for (int i = 0; i < 54000; i++) {
            try {
                new User("Bob", 25);
                num++;
            } catch(OutOfMemoryError e) {
                break;
            }
        }
        System.out.println("Objects created before error: " + num);
        showInfo();
        System.out.println("Finish.");
    }

您必须捕获异常,并且只有在成功创建对象时才增加计数器。

关于java - 在发生 OutOfMemoryError 错误之前对对象进行计数 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42631230/

相关文章:

java - 我可以简单地使用TreeSet对ArrayList的ArrayList进行排序吗?

java - 如何更新TreeTableView数据?

java - android.net.VPNServicec 不是封闭类

java - 如何确定正在运行的 JVM 上的 MaxDirectMemorySize?

java - 为什么垃圾收集启动时 "from"幸存者空间不为空?

java - Android 中的图像选择出现 OutOfMemoryError。如何在将图像解码为位图之前调整图像大小?

java - 管理 Java 中的异常

garbage-collection - 为什么 CMS(并发模式失败)会在这里发生?

android - 使用 Gson 解析大型 JSON 响应时出现 OutOfMemoryError

c++ - 增加 eclipse CDT 中的堆栈大小?