Java虚拟机 JVM
- JVM是Java Virtual Machine(Java虚拟机)的缩写
- JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿 真模拟各种计算机功能来实现的。
- JVM就是一个虚拟的用于执行bytecodes字节码的计算机 • Java虚拟机是Java最核心技术,也是跨平台的基础。
- Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
- Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能 够“一次编译,到处运行”的原因
JVM内存模型
JVM
- 堆
- 本地方法栈
- 虚拟机栈
- 方法区(元空间)
- 程序计数器
- JVM垃圾回收机制 内存划分
类加载子系统
加载顺序:
// 静态的变量是优先在new之前加载,并且会提供一个默认值
1.加载
通过类加载子系统,会加载.class文件,
会通过执行引擎会执行class文件的解析和翻译工作
2.链接
1.验证 2.准备 3.解析
先要判断class文件是否是合理的,对于java文件而言,前缀必须CA
2.准备工作是将验证忠厚的文件引入到JVM内存模型(虚拟机栈)
3.对class文件进行解析(需要使用JVM的指令集)
3.初始化
初始化其实就是new对象的过程
在创建对象的时候;
App app = new App();
在app创建的过程中,还是执行了很多顺序的
static{
}
类加载的机制:
就是在程序运行中,通过JVM的类加载子系统,将编译之后的class文件
类加载的过程:
加载器分类:
1.引导性,Bootstrap类型的类加载器
三种JVM提供的类加载器:
BootstrapLoader :引导类加载器 sun.boot.class.path
ExtClassLoader :扩展类加载器 java.ext.dirs
AppClassLoader :应用程序类加载器 java.class.path
2.自定义的类加载器
双亲委派机制
加载类的时候
Bootstrap 双亲委派机制
App.class --> AppClassLoader --> ExtClassLoader --> BootstrapLoader --I
Custom ClassLoader |
App.class <-- AppClassLoader <-- ExtClassLoader <-- BootstrapLoader <-J
如果是使用的自定义String
如何打破双亲委派机制?
1.自己写一个类加载器
2.重写loadclass方法
3.重写findclass方法
虚拟机栈包含的内容:
局部变量表
操作数栈
动态链接
方法出口
堆区的内存划分:
新生代:
尹甸圆区
form
to
//新生代老年代比例 2:8
//伊甸园区:form:to=8:1:1
伊甸园区内存不够的时候回发生一次垃圾回收
该回收是叫Minor GC,每次GC都会伴随STW,stop the word,耗时比较久
如果发生在老年代的GC叫FULL GC/Marjor GC,事件很长
可能需要等待好几秒钟
一般是不太能允许FULL GC的发生
内存满了才会发生垃圾回收
老年代内存 100M 1G jvm
实现调优