了解java中的内存分配和GC

St.*_*rio 3 java garbage-collection

我试图了解垃圾收集算法的工作原理.我正在读这篇文章.据我所知,每一个分配都发生在Young一代.如果没有足够的可用空间可以Minor GC触发清洁Young代(Eden,S1,S2).但现在想象我们有一些类:

public class TestYoungCrash{
    private long l1;
    private long l2;
    //...
    private long l100000000;
    //tons of other fields
}
Run Code Online (Sandbox Code Playgroud)

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

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

Gho*_*ica 5

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

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

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

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