JVM之Java运行时数据区(线程共享区)

JVM运行时区域各线程共享的区域包括堆区和方法区。

堆区

堆区最最主要的功能是存储对象实例【上篇也提到过】,因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区。如果堆区的内存不够会出现OutOfMemory异常。

为了方便回收,堆区可以细分为新生代和老年代。顾名思义,新生代里都是新创建的或者年龄不大的对象,新生代区又有三个区域,eden区,s0区和s1区。绝大多数情况新生对象都是在eden区,当一次回收之后如果对象还存在,就会进入s0或者s1区,之后每次回收如果都能存在,那么年纪就加一,达到一定年龄后就会进入老年代区。

老年代区存储的都是经过很多次回收仍然存在的,也有一些大的对象会直接进入老年代【比如长字符串和长数组】,表示这里对象存活率高,声明周期长。老年代和新生代区域的差别在于新生代GC次数更加频繁。

方法区

在不同的JDK版本和不同的JVM实现方式中,方法区的实现方法多经变更,甚至互相矛盾,例如永久代和元空间,因此很难详细的总结方法区的具体工作方式。因此,了解方法区的主要存储对象是更为重要的,包括:

1、类型信息:

    类的完整名称

    类的直接父类的完整名称

    类的直接实现接口的有序列表

    类型标志(类类型还是接口类型)

    类的修饰符(public private defautl abstract final static)

  2、类型的常量池

    存放该类型所用到的常量的有序集合,包括直接常量(字符串、整数、浮点数)和对其他类型、字段、方法的符号引用。

  3、字段信息(该类声明的所有字段)

    字段修饰符(public、peotect、private、default)

    字段的类型

    字段名称

  4、方法信息

    方法信息中包含类的所有方法。

    方法修饰符

    方法返回类型

    方法名

    方法参数个数、类型、顺序等

    方法字节码

    操作数栈和该方法在栈帧中的局部变量区大小

    异常表

  5、类变量(静态变量)

  6、指向类加载器的引用

  7、指向Class实例的引用

  8、方法表

  9、运行时常量池(Runtime Constant Pool)

方法区存储内容转载自这里

总结:堆区用于存储实例对象,GC过程在此发生;方法区存储很多东西,重要的包括常量池、静态变量以及一些类和方法信息;栈区存储方法的参数和局部变量,还有基本数据类型和引用类型的引用。

上一篇:JavaScript异步操作


下一篇:JS 中的对象