JVM内存结构之Java堆

Java堆(Java Heap)是JVM中最大的一块内存区域,用于存储Java对象实例和数组。Java堆是被所有线程共享的内存区域,所有对象实例的创建、使用、销毁都发生在Java堆上。

Java堆在物理上可以分为两个部分:新生代(Young Generation)和年老代(Old Generation),其中新生代又分为Eden空间、Survivor空间1和Survivor空间2。Eden空间和Survivor空间是为新创建的对象分配内存所用,年老代则是存放长时间存活的对象。

当需要为一个对象分配内存时,JVM会先检查新生代的Eden空间,如果Eden空间的空闲内存不足以存放该对象,就会触发一次垃圾收集(Minor GC),把Eden空间和Survivor空间中已经死亡的对象回收,如果剩余空间仍然不足以存放该对象,就会把年轻代的对象转移到年老代中,如果年老代的空间也不足以存放该对象,就会触发另一次垃圾收集(Full GC),回收整个堆中已经死亡的对象,然后将存活的对象整理到堆的起始位置,以便下次分配内存。

下面是一个示例代码,演示了如何在Java堆上创建和使用对象:

public class Person {
    private String name;
    private int age;

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

    public void sayHello() {
        System.out.println("Hello, my name is " + name + ", I am " + age + " years old.");
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 20);
        person.sayHello();
    }
}

在这个例子中,我们创建了一个Person类的实例,即一个Person对象。这个对象会被分配到Java堆中,然后我们调用这个对象的sayHello()方法,在控制台上输出一句问候语。在这个过程中,我们并没有直接管理Java堆中的内存,而是通过Java语言层面的对象引用来访问和操作Java堆中的数据。