主页传送门: 传送
JVM(Java Virtual Machine)堆是Java应用程序运行时内存管理的重要组成部分之一。堆内存用于存储Java对象实例,这些对象在运行时被动态分配和管理。
一个 JVM 实例只存在一个堆内存,堆内存的大小是可调节的。它取决于应用程序的需求和JVM的配置。
堆可分为新生代(Eden 区:From Survior,To Survivor)、老年代。
新生代用于存储新创建的对象,而老年代用于存储存活时间较长的对象。
Java 虚拟机规范规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。
关于 Survivor s0,s1 区: 复制之后有交换,谁空谁是 to。
老年代比新生代生命周期长。
新生代与老年代空间默认比例 1:2:JVM 调参数,XX:NewRatio=2,表示新生代占 1,老年代占 2,新生代占整个堆的 1/3。
Eden 空间和另外两个 Survivor 空间缺省所占的比例是:8:1:1。
几乎所有的 Java 对象都是在 Eden 区被 new 出来的,Eden 放不了的大对象,就直接进入老年代了。
四种引用方式
参数 | 说明 | 示例 |
---|---|---|
-Xms | 设置初始堆大小。 | -Xms256m表示初始堆大小为256MB。默认值通常是较小的值,例如32MB。 |
-Xmx | 设置最大堆大小。 | -Xmx1024m表示最大堆大小为1GB。根据应用程序的需求,可以调整这个值。一般此值建议与-Xmx相同,避免每次垃圾回收完成后JVM重新分配内存 |
-Xmn | 设置新生代的大小。(新生代是堆的一部分,用于存储新创建的对象。) | -Xmn256m表示新生代大小为256MB。 |
-XX:MaxPermSize | (在Java 7之前)指定永久代(Permanent Generation)的最大大小。永久代用于存储类的元数据信息等。 | -XX:MaxPermSize=128m表示永久代最大为128MB。 |
-XX:MaxMetaspaceSize | (Java 8及以后)指定元空间(Metaspace)的最大大小。元空间取代了永久代,用于存储类的元数据信息。 | -XX:MaxMetaspaceSize=256m表示元空间最大为256MB。 |
-XX:PermSize | (在Java 7之前)指定永久代的初始大小。 | -XX:PermSize=64m表示永久代的初始大小为64MB。 |
-XX:MetaspaceSize | (Java 8及以后)指定元空间的初始大小。 | -XX:MetaspaceSize=128m表示元空间的初始大小为128MB。 |
-XX:NewRatio= | 设置新生代和老年代的大小比例。 | -XX:NewRatio=2表示新生代大小为老年代大小的1/3。 |
-XX:SurvivorRatio= | 设置新生代中Eden区和Survivor区的大小比例。 | -XX:SurvivorRatio=8表示Eden区大小是Survivor区大小的8倍。 |
-XX:+UseSerialGC | 使用串行垃圾回收器 | 适用于单线程应用程序。 |
-XX:+UseParallelGC | 使用并行垃圾回收器。 | 适用于多核处理器的应用程序。 |
-XX:+UseConcMarkSweepGC | 使用CMS(Concurrent Mark-Sweep)垃圾回收器。 | 适用于需要降低垃圾回收停顿时间的应用程序。 |
public class HeapMemoryExample {
public static void main(String[] args) {
// 创建一个数组对象并分配到堆内存中
int[] numbers = new int[1000];
// 堆内存中的对象可以动态修改
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i * 2;
}
// 创建一个字符串对象并分配到堆内存中
String greeting = "Hello, World!";
// 堆内存中的对象可以通过引用来访问
System.out.println(greeting);
// 创建自定义对象并分配到堆内存中
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Bob", 30);
// 堆内存中的对象可以相互引用
person1.setFriend(person2);
person2.setFriend(person1);
}
}
class Person {
private String name;
private int age;
private Person friend;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void setFriend(Person friend) {
this.friend = friend;
}
}
上面的示例中创建了一个整数数组、一个字符串和自定义的Person对象,并将它们分配到堆内存中。堆内存中的对象可以通过引用来访问,可以进行动态修改和相互引用。这些对象的内存管理由JVM的垃圾回收器负责,不需要手动释放内存。
如果喜欢的话,欢迎 关注 点赞 评论 收藏 一起讨论 你的支持就是我✍️创作的动力!