JVM:
- jvm 的位置:运行在操作系统之上
2. jvm 的体系结构:****
类加载器,执行引擎
方法区,堆
方法栈,本地方法栈,程序计数器
本地方法接口 本地方法库!
2.1 类加载器:
只负责加载class 文件,执行引擎负责执行! 在jvm 中生成一个类的模板!
分类:了解
虚拟机自带的加载器
启动类加载器(Bootstrap)C++
扩展类加载器(Extension)Java
应用程序类加载器
(AppClassLoader)Java
也叫系统类加载器,加载当前应用的classpath的所有类
用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式
加载顺序:有下往上
2.2 执行引擎:Execution Engine执行引擎负责解释命令,提交操作系统执行。
2.3 Native Interface本地接口、方法
由natvie 修饰的! 由执行引擎加载本地方法库! 由c,c++ 编写的!
2.4 程序计数器、PC寄存器:
本质:指针 {向下一条指令的地址}
2.5 方法区:{共享区间} {非堆}
内有的东西:字段和方法字节码,以及一些特殊方法如构造函数,接口代码!
静态变量+常量+类信息(构造方法/接口定义)+运行时常量池存在方法区中
Cart cart = new Cart(); 在堆内存中!
2.6 栈:
栈内存:主管Java程序的运行!
生命周期:跟线程一样!
栈内存中存储的内容:
8种基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。
int a = 9;
Cart cart = new Cart();
栈运行原理:
栈中的数据以栈帧{数据,文件}的形式存在! “先进后出”/“后进先出”原则.
StackOverflowError:
检查代码的业务逻辑!
3. JVM 三大厂商了解;
4. 堆:
OutOfMemoryError:指的是堆内存溢出!
可以通过参数-Xms、-Xmx来调整!
幸存0区,幸存1区: 称之为:from ,to 区!需要经过15次GC 才会到养老区。 to 区 总是空的!
1.7 堆的划分:
新生区:
养老区:
永久区:
1.8 堆的划分:
新生区:
养老区:
元空间:
永久区:虚拟机自身的class ,interface!
1.8 我们将常量池移动到元空间上!
总结上午:
- jvm 体系架构图:
类加载器 : 执行引擎
方法区{共享区,非堆}:堆
方法栈:本地方法栈:程序计数器、PC寄存器:
本地接口,本地方法库!
了解:
jvm 的体系架构图中每块的作用:
2. 堆:
新生区:
伊甸区:新创建的对象 Student stu = new Student();
幸存0区 from:
幸存1区 to:
to 区总是空!
普通GC: 经过15次 幸存者来到养老区!
养老区:
Full GC:
元空间:
3. 如何调优!
-Xms1024m -Xmx1024m -XX:+PrintGCDetails
idea 中如何设置获取到内存溢出数据:
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\
HeapDumpOnOutOfMemoryError:导出oom 信息到文件!
使用:
jvisualvm.exe 解读文档!
4. GC 讲解:
GC: 分代收集算法
最频繁:新生区
次之: 养老区
基本不动: 元空间,永久区!
GC 4大算法:
a. 引用计数法:
不好维护:
很难用
b. 复制算法:
新生区:
优点:效率高,没有内存碎片产生
缺点:需要双倍内存空间
c. 标记清除:
养老区:
优点:节省内存空间
缺点:两次扫描,可能会产生内存碎片!
d. 标记压缩:
养老区:
优点:没有产生内存碎片:
缺点:移动需要时间
总结:
新生区:复制算法
养老区:标记清除-标记压缩
普通GC 发生在新生区:
Full GC 放生在养老区: