Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OutOfMemoryError之前计数对象(Java)_Java_Garbage Collection_Out Of Memory - Fatal编程技术网

在OutOfMemoryError之前计数对象(Java)

在OutOfMemoryError之前计数对象(Java),java,garbage-collection,out-of-memory,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() t

我是一名编程初学者,我试图通过运行下面的代码和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.");
    }
}
我使用的是一个3mb的小堆(
-Xmx3mb

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

公共静态void main(String[]args){
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.");
    }
int num=0; System.out.println(“开始…”); 对于(int i=0;i<54000;i++){ 试一试{ 新用户(“Bob”,25岁); num++; }捕获(OutOfMemory错误){ 打破 } } System.out.println(“在错误之前创建的对象:+num”); showInfo(); System.out.println(“Finish”); }
如果成功创建对象,则必须捕获异常并仅递增计数器。

publicstaticvoidmain(String[]args){
int num=0;
System.out.println(“开始…”);
对于(int i=0;i<54000;i++){
试一试{
新用户(“Bob”,25岁);
num++;
}捕获(OutOfMemory错误){
打破
}
}
System.out.println(“在错误之前创建的对象:+num”);
showInfo();
System.out.println(“Finish”);
}

如果成功创建对象,您必须捕获异常并仅递增计数器。

您可以强制堆转储,然后使用eclipse MAT进行检查。如果出现内存不足错误,您能否捕获错误并输出
num
?@SteveSmith,您可能没有执行进一步操作所需的额外内存actions@SteveSmith,我尝试使用try/catch块来实现这一点,但什么也没发生,只是一条短消息“Java heap space error”,请记住,
finalize
覆盖会显著改变对象内存的管理方式,甚至可能无法运行。它们倾向于阻止实例的收集,至少在一段时间内是这样。你的
finalize
方法没有什么作用,可能会损坏你的证据。你可以强制堆转储,然后用eclipse MAT检查。你能捕获错误,然后输出
num
?@SteveSmith如果出现内存不足错误,你可能没有额外的内存来执行进一步的操作actions@SteveSmith,我尝试使用try/catch块来实现这一点,但什么也没发生,只是一条短消息“Java堆空间错误”。请记住,
finalize
覆盖会显著改变对象内存的管理方式,甚至可能无法运行。它们倾向于阻止实例的收集,至少在一段时间内是这样。您的
finalize
方法没有什么用处,可能会损坏您的证据。这不应该创建OOME。您怎么办mean@njzk2:在这种特定情况下,
User
具有自定义的
finalize()
方法这一事实是可能引发的
OutOfMemoryError
s的实际原因,由于无法保证终结器线程能够赶上分配速率,因此终结队列中将有大量的对象挂起。当然,这样的测试并没有说明所选择的垃圾收集算法。这不应该创建一个OOME。你认为呢mean@njzk2:在这种特定情况下,
User
具有自定义的
finalize()
方法这一事实是可能引发的
OutOfMemoryError
s的实际原因,由于无法保证终结器线程能够赶上分配速率,因此终结队列中将有大量的对象挂起。当然,这样的测试并没有说明所选择的垃圾收集算法。
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.");
    }