1. Java虚拟机运行时数据区html
在JDK1.8以前,JVM运行时数据区分为堆、虚拟机栈、本地方法栈、方法区、程序计数器。以下图所示:数组
虚拟机栈:线程私有,随线程建立而建立。栈里面是一个一个“栈帧”,每一个栈帧对应一次方法调用。栈帧中存放了局部变量表(基本数据类型变量和对象引用)、操做数栈、方法出口等信息。当栈调用深度大于JVM所容许的范围,会抛出StackOverflowError的错误。工具
本地方法栈:线程私有,这部分主要与虚拟机用到的Native方法相关,通常状况下,并不须要关心这部分的内容。spa
程序计数器:也叫PC寄存器,JVM支持多个线程同时运行,每一个线程都有本身的程序计数器。假若当前执行的是 JVM 的方法,则该寄存器中保存当前执行指令的地址;假若执行的是native方法,则PC寄存器中为空。(PS:线程执行过程当中并不都是一口气执行完,有可能在一个CPU时钟周期内没有执行完,因为时间片用完了,因此不得不暂停执行,当下一次得到CPU资源时,经过程序计数器就知道该从什么地方开始执行).net
方法区:方法区存放类的信息(包括类的字节码,类的结构)、常量、静态变量等。字符串常量池就是在方法区中。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,可是它却有一个别名叫作Non-Heap(非堆),目的是与Java堆区分开来。不少人都更愿意把方法区称为“永久代”(Permanent Generation)。从jdk1.7已经开始准备“去永久代”的规划,jdk1.7的HotSpot中,已经把本来放在方法区中的静态变量、字符串常量池等移到堆内存中。线程
运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各类字面量和符号引用,这部份内容将在类加载后进入方法区的运行时常量池中存放。htm
堆:堆中存放的是数组(PS:数组也是对象)和对象。当申请不到空间时会抛出OutOfMemoryError。对象
2. PermGen(永久代)blog
“方法区”是JVM的规范,而“永久代”是方法区的一种实现,而且只有HotSpot才有“PermGen space”,而对于其余类型的虚拟机并无“PermGen space”。接口
在JDK1.8中,HotSpot已经没有“PermGen space”这个区间了,取而代之是Metaspace(元空间)
3. Metaspace(元空间)
在JDK1.8中,永久代已经不存在,存储的类信息、编译后的代码数据等已经移动到了MetaSpace(元空间)中,元空间并无处于堆内存上,而是直接占用的本地内存(NativeMemory)。
元空间的本质和永久代相似,都是对JVM规范中方法区的实现。
不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
元空间的大小仅受本地内存限制,能够经过如下参数来指定元空间大小:
4. 堆内存划分
在JDK1.7以及其前期的JDK版本中,堆内存一般被分为三块区域:Young Generation、Old Generation、Permanent Generation for VM Matedata
在JDK1.8中把存放元数据中的永久内存从堆内存中移到了本地内存中,JDK1.8中JVM堆内存结构就变成了以下:
Minor GC 和 Full GC的区别?
(1)新生代GC(Minor GC):指发生在新生代的垃圾收动做,由于Java对象大多都具有朝生夕灭的特性,因此Minor GC很是频繁,通常回收速度也很快
(2)老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC常常会伴随至少至少一次的Minor GC(但非绝对,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程),Major GC的速度比Minor GC慢10倍以上。
5. 堆统计信息
6. 其它相关
7. 参考
https://blog.csdn.net/qq_31337311/article/details/78799262
http://www.javashuo.com/article/p-fdtgegxz-hk.html
https://blog.csdn.net/zwrlj527/article/details/79399715
8. 摘抄自