JVM(一)JVM运行时数据区
1、JVM运行时数据区
1.1、线程共享数据区
(1)方法区(Method Area)
方法区用来存放JVM加载的类、常量及静态变量等信息。
- 永久代
(2)堆(Heap)
堆里面主要存放使用new操作创建的对象实例。
-
新生代
- Eden空间
- From Survivor空间
- To Survivor空间
-
老年代
- 如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1,。对象在Survivor区中每“熬过”一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁),将会被晋升到老年代中。
1.2、线程私有数据区
(1)虚拟机栈(VM Stack)
- 每个线程都有自己的栈资源,用来存储该线程的局部变量,这些局部变量是线程私有的,其他线程是访问不了的,除此之外栈还用来存放线程的调用栈帧。
(2)本地方法栈(Native Method Stack)
- Native方法就是程序中用修饰词native修饰的方法,一个Native Method就是一个java调用非java代码的接口。
(3)程序计数器(Program Counter Register)
- 为什么要将程序计数器设计为线程私有的呢?
因为CPU一般是使用时间片轮转方式让线程轮询占用的,所以当前线程CPU时间片用完后,要让出CPU,等下次轮到自己的时候再执行。那么如何知道之前程序执行到哪里了呢?其实程序计数器就是为了记录该线程让出CPU时的执行地址的,待再次分配到时间片时线程就可以从自己私有的计数器指定地址继续执行。