A-A+

Java虚拟机之辨清Java堆

2016年04月21日 Java 暂无评论 阅读 124 views 次

Java堆是和Java应用程序关系最为密切的内存空间,几乎所有的对象都放在堆中。并且Java堆是完全自动化管理的,通过垃圾回收机制,垃圾对象会被自动清理,而不需要显式地释放,c/c++中的free()等为显示地释放内存。

根据垃圾回收机制的不同,Java堆有可能拥有不同的结构。最为常见的一种构成是将整个Java堆分为新生代和老年代。其中,新生代存放新生对象或者年龄不大的对象,老年代则存放老年对象。新生代有可能分为eden区、s0区和s1区,s0区和s1区也被称为from和to区域,它们是两块大小相等、可以互换角色的内存空间。后面会进行详细介绍新生代等。

堆空间的一般结构:

堆空间的一般结构

在绝大情况下,对象首先分配在eden区,在一次新生代回收后,如果对象还存活,则会进入s0或者s1,之后,每经过一次新生代回收,如果对象存活,它的年龄就会加1。当对象的年龄达到一定条件后,就会被认为是老年对象,从而进入老年代。

通过下面代码举例说明:

  1. package com.ifcoding.jvm;
  2. public class SimpleHeap {
  3.     private int id;
  4.     public SimpleHeap(int id) {
  5.         this.id = id;
  6.     }
  7.     public void show(){
  8.         System.out.println("My ID is " + id);
  9.     }
  10.     public static void main(String[] args) {
  11.         SimpleHeap s1 = new SimpleHeap(1);
  12.         SimpleHeap s2 = new SimpleHeap(2);
  13.         s1.show();
  14.         s2.show();
  15.     }
  16. }

上述代码声明了一个SimpleHeap类,并在main()方法中创建了两个SimpleHeap实例。

堆、方法区、栈的关系

 

给我留言

*

Copyright © If Coding 保留所有权利.   Theme  Ality   

用户登录