**程序计数器**(Program Counter Register) 它是程序控制流的指示器,简单来说,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器
**Java虚拟机栈**(Java Virtual Machine Stack)也是线程私有的,它的生命周期 与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型。
**本地方法栈**(Native Method Stacks)本地方法栈是为虚拟机使用到的本地(Native) 方法服务。
**Java堆**(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所 有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。
这里可能会考点面试题,什么垃圾回收器之类的。
**方法区(Method Area)**与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载 的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
说到方法区,不得不提一下“永久代”这个概念,尤其是在JDK 8以前,许多Java程序员都习惯在 HotSpot虚拟机上开发、部署程序,很多人都更愿意把方法区称呼为“永久代”(Permanent Generation),或将两者混为一谈。本质上这两者并不是等价的,因为仅仅是当时的HotSpot虚拟机设 计团队选择把收集器的分代设计扩展至方法区,或者说使用永久代来实现方法区而已。
**元空间(Metaspace)**是 Java 虚拟机中方法区(Method Area)的一种实现。
元空间的引入旨在解决永久代的一些问题,如内存泄漏和溢出。元空间的特点包括:
动态分配: 元空间不再有固定的大小限制,它会根据应用程序的需要进行动态分配和释放内存。
GC(垃圾回收)管理: 类的元数据现在由 JVM 的垃圾回收器进行管理。这意味着当类不再被使用时,相关的元数据可以被垃圾回收器回收。
避免永久代的问题: 元空间的动态性质和垃圾回收的管理有助于避免永久代常见的内存泄漏和溢出问题。
**运行时常量池(Runtime Constant Pool)**是方法区的一部分。Class文件中除了有类的版本、字 段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生 成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
这部分较为简单,我这边就不怎么介绍了,关于垃圾回收器的几种算法,什么类型的垃圾回收器,我下下篇文章可能会写到。