Java垃圾收集器与内存分配策略详解
什么是垃圾收集器?
Java垃圾收集器是Java虚拟机(JVM)提供的一种内存管理机制,它用于回收不再被程序引用的对象以节省内存空间。垃圾收集器通过对程序进行监控,可以自动发现未被引用的对象并将其回收。Java中的垃圾收集器大致可以分为如下四种:
- Serial
- Parallel
- Concurrent Mark Sweep (CMS)
- G1
内存分配策略
Java应用程序启动时,JVM会预留一定量的内存空间作为Java堆,用于存储对象。但是,Java堆中的内存空间是有限的,而且Java应用程序中创建的对象是不确定的,有可能创建大量的对象,容易导致内存溢出,因此,JVM采用了不同的内存分配策略,以确保Java应用程序在分配对象时的内存使用效率和安全性。
Java中常用的内存分配策略包括:
- 对象优先分配策略
- 大对象直接进入老年代
- 长期存活的对象进入老年代
- 空间分配担保
示例说明
对象优先分配策略
对象优先分配策略是当堆中的内存空间还比较充足时,JVM会优先分配空间给新建立的对象,由于这种分配策略的灵活性较高,所以被广泛应用。
class MyClass{
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
String str = new String();
list.add(str);
}
}
}
在这个示例代码中,我们在for循环内,用了我们熟知的ArrayList存储了10000个字符串。由于在执行for循环时,内存空间还比较充足,因此JVM会优先为这些新建立的字符串对象分配空间。
长期存活的对象进入老年代
当一个对象经过多次垃圾收集后依然存活时,JVM会把这个对象划分为“长期存活”的对象,将其移动到老年代中。这种分配策略避免了短期存活对象对垃圾收集器的影响,提高了垃圾收集效率。
class MyClass{
public static void main(String[] args) {
byte[] arr1 = new byte[2 * 1024 * 1024];
byte[] arr2 = new byte[2 * 1024 * 1024];
byte[] arr3 = new byte[2 * 1024 * 1024];
byte[] arr4 = new byte[4 * 1024 * 1024];
byte[] arr5 = new byte[2 * 1024 * 1024];
}
}
在这个示例代码中,我们使用new byte[]语句创建了5个字节数组对象,并分别赋予了越来越大的内存,这个时候,JVM会将arr1、arr2、arr3这三个对象划分为“短期对象”,加入到年轻代中进行垃圾回收处理;而arr4添加到老年代中。arr5在分配时空间不足,因此会触发一次年轻代垃圾回收(UnmanagedType Collection)。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java垃圾收集器与内存分配策略详解 - Python技术站