在程序执行的时候 JVM定义了各种的运行时数据区,一些数据区域是在JVM启动的时候创建的,也在JVM销毁的时候销毁,还有一些数据区域是在线程创建的时候创建,在线程销毁的时候销毁。
运行时数据区由6部分组成
1 程序计数器(Program Counter Register)
2 虚拟机栈 (VM Stack)
3 本地方法栈 (Native Method Stack)
4 方法区 (Method Area)
4.1 方法区是个逻辑的概念,用来存放类的信息 例如 类信息中的常量池 字段 方法 等
4.2 jdk<=1.7 ,方法区称为永久代 FGC不会回收 也不会触发FGC
4.3 jdk>=1.8 ,方法区称为元空间 FGC会回收 当达到阈值的时候 也会触发FGC
4.4 永久代和元空间的区别,两个都是对方法区的具体实现,只是实现方式不同,永久代是在JVM中单独开放一个空间用来存放数据,比如字符串常量池就是存放在这个空间中,而元空间并没有在jvm中单独开放一个空间,而是将数据存放在本地内存中,但是将字符串常量池存放在JVM的堆中。(如何证明元空间的字符串常量池是在堆中?一直创建字符串常量,观察堆,和Metaspace)
5 运行时常量池(Run-Time Constant Pool)=>其实是方法区的一部分
6 堆(Heap)
从线程的访问范围区分
线程共享 =》方法区 堆 运行时常量池
线程私有=》程序计数器 虚拟机栈 本地方法栈