JVM 运行时数据区

   在程序执行的时候 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)

 从线程的访问范围区分

  线程共享 =》方法区 堆 运行时常量池

  线程私有=》程序计数器 虚拟机栈 本地方法栈

    

原文地址:https://www.cnblogs.com/Tony100/p/13530786.html