了解java中的内存分配和GC

时间:2017-10-11 09:04:55

标签: java garbage-collection

我正在努力了解垃圾收集算法的工作原理。我正在读这个article。据我所知,每个分配都发生在 Young generation 中。如果没有足够的可用空间,则会触发Minor GC来清理Young代(Eden,S1,S2)。但现在想象我们有一些类:

public class TestYoungCrash{
    private long l1;
    private long l2;
    //...
    private long l100000000;
    //tons of other fields
}

所以即使这一代人完全清楚,班级的目标也不适合年轻一代。

那会发生什么?它是标准化的吗?

1 个答案:

答案 0 :(得分:5)

不可能有一个需要大量内存的对象。但不是因为内存限制,而是出于更实际的原因--JVM限制了每个类的字段数,请参阅here

  

类或接口可以声明的字段数量被ClassFile结构(第4.1节)的fields_count项的大小限制为65535。

你班上不能有这么多字段会炸毁记忆。我很确定:如果你创建一个堆如此小的JVM,以至于包含那些65535长字段的单个对象不适合...... JVM很可能甚至都不会启动。

从这个意义上说,我们可以将你的问题改写为:当我创建一个太大而不适合提供给JVM的堆空间的数组时会发生什么?然后你基本上回到这个question ...其中说: OutOfMemoryError