JVM基础知识总结及参数配置

1、JVM体系结构图
JVM基础知识总结及参数配置
2、类加载器
Java类加载器基于三个机制:委托、可见性和单一性。委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。类加载器负责加载文件系统、网络或其他来源的类文件。有三种默认使用的类加载器(jvm自带):Bootstrap类加载器、Extension类加载器和System类加载器(或者叫作Application类加载器)。每种类加载器都有设定好从哪里加载类。

3、本地方法栈、本地方法接口
用于融合其他编成语言为java所用
JVM基础知识总结及参数配置

4、pc寄存器
程序计数器:记录程序的执行顺序

5、方法区、静态区
方法区存储了每一个类的结构信息、方法区是规范,在不同的虚拟机里头实现是不一样的,最典型的就是永久代和元空间。
1.方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

注意:Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。在Java8中,元空间(Metaspace)登上舞台,方法区存在于元空间(Metaspace)。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。永久代的参数-XX:PermSize和-XX:MaxPermSize也随之失效。当Java Heap空间不足时会触发GC,但Native memory空间不够却不会触发GC。

6、栈
栈区:对象实例在Heap(堆)中分配好以后,需要在Stack中保存一个4字节的Heap内存地址,用来定位该对象实例在Heap 中的位置,便于找到该对象实例。
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中。
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
4.由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
5.栈管运行、堆管存储
JVM基础知识总结及参数配置
JVM基础知识总结及参数配置

7、堆
堆区:专门用来保存对象的实例(创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中)。堆的结构,物理:新生代+老年代,逻辑上:新生代+老年代+永久代(java7),java8永久代被移除。
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
3.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
JVM基础知识总结及参数配置
JVM基础知识总结及参数配置
JVM基础知识总结及参数配置

8、GC算法
JVM基础知识总结及参数配置
● 引用计数法(一般不采用)
● 复制算法(Copying)
● 标记清除算法(Mark-Sweep)
● 标记压缩算法(Mark-Compact)

9、执行过程(Java8)
(1)java编译器把类编译成.class文件。
(2)类加载器加载.class文件。
(3)栈负责运行和存储本地(8种基本数据类型和对象的引用)变量、栈操作、实例方法出口等等。
(4)堆负责存储创建的对象和数组、静态变量、字符串常量池。说明:动态创建的字符串不会默认跑到常量池里面的,不用担心GC扫不掉它们。
(5)方法区负责存储类元信息。

给大家推荐一篇文章:JVM参数设置