1.JVM所处的位置
2.JVM的体系结构
3.类加载器
作用:将类加载到虚拟机
1). 虚拟机自带的加载器
2). 启动类(根)加载器 加载rt.jar
3).扩展类加载器 ext/*.jar
4).应用程序加载器 classpath下的类
4.双亲委派机制
1)用户如何自定义加载器?
2)如何加载不到类:会提示报错class not found
3)spi破坏了双亲委派机制
5.沙箱安全机制
6.native method stack
1)凡是带了native关键字的方法,说明java的作用域达不到了,会去调用底层c或者c++语言的库!流程:本地方法栈—>本地方法接口
2)JNI的作用扩展java的使用,融合不同的编程语言为java所用eg:Robot
7.pc寄存器
8.方法区
1)所有线程共享,常量池在方法区内
2)静态变量,常量,类信息(构造方法,接口定义),运行时的常量池存在方法区中。但是实际变量存在内存中 即:static final class 常量池
9.栈(数据结构)
程序=数据结构+算法
程序=框架+业务逻辑 ❌
栈存储的内容:8大基本类型,对象的引用
10.三种JVM
1)sun公司虚拟机HotSpot
2)Bea 公司 JRockit
3)IBM公司j9vm JIT
11.堆(Heap)
1)一个jvm只有一个堆内存,堆内存大小可以调节
2)堆内存细分三个区域:新生区(Eden),老年区,永久区
模拟OOM
3)在JDK8以后,永久存储区改了名字叫元空间
12.新生区.老年区,永久区
1)新生区:类诞生和成长的地方,甚至死亡
2)新生区包含 Eden+幸存0区和幸存1区
3)永久区:常驻内存用来存放jdk自身携带的class对象,接口元数据,存储的是java运行时的一些环境!关闭虚拟机释放区域内存,一个启动类加载大量的第三方jar包。tomcat部署太多的应用,大量动态生成的反射类不断背加载直到内存满就会OOM
jdk6:永久代,常量池是在方法区
jdk7:永久代,但是慢慢的退化了(去永久代),常量池堆种
jdk8:无永久代,常量池在元空间
问题:Java8中的JVM元空间是不是方法区?
不是,元空间是方法区的一种具体实现。首先,方法区是JVM规范的一个概念定义,并不是一个具体的实现,每一个JVM的实现都可以有各自的实现;然后,在Java官方的HotSpot 虚拟机中,Java8版本以后,是用元空间来实现的方法区;在Java8之前的版本,则是用永久代实现的方法区;也就是说,“元空间” 和 “方法区”,一个是HotSpot 的具体实现技术,一个是JVM规范的抽象定义;所以,并不能说“JVM的元空间是方法区”,但是可以说在Java8以后的HotSpot 中“元空间用来实现了方法区”。然后多说一句,这个元空间是使用本地内存(Native Memory)实现的,也就是说它的内存是不在虚拟机内的,所以可以理论上物理机器还有多个内存就可以分配,而不用再受限于JVM本身分配的内存了。
14.堆内存调优
Jprofile工具分析OOM原因
MAT分析OOM原因
在一个项目中突然出现了OOM故障,那么该怎么排除呢?
MAT,jprofier作用
分析Dump内存文件,快速定位内存泄漏
15.GC
1.常用算法引用计数法
2.复制算法
3.标记压缩清除
16.JMM
学习了解虚拟机方法:百度 思维导图