前言:
本文内容:JVM学习方式、JVM体系结构、类加载器及双亲委派机制
推荐免费JVM快速入门视频:【狂神说Java】JVM快速入门篇_哔哩哔哩_bilibili
JVM学习方式
面试提问
- 请你谈谈你对JVM的理解?Java8虚拟机和之前的变化更新?
- 什么是OOM,什么是栈溢出
StackOverFlowError
?怎么分析?
- JVM的常用调优参数有哪些?
- 内存快照如何抓取,怎么分析Dump文件?
- 谈谈JVM中,类加载器你的认识?
学习内容预览
- JVM的位置
- JVM的体系结构
- 类加载器
- 双亲委派机制
- 沙箱安全机制
- Native
- PC寄存器
- 方法区
- 栈
- 三种JVM
- 堆
- 新生区、老年区
- 永久区
- 堆内存调优
- GC–常用算法
- JMM
- 总结
JVM体系结构
JVM的位置
JVM的体系结构
类加载器及双亲委派机制
类加载器
作用:加载Class文件
User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package demo01;
public class User {
public static void main(String[] args) { User user1 = new User(); User user2 = new User(); User user3 = new User(); System.out.println(user1.hashCode()); System.out.println(user2.hashCode()); System.out.println(user3.hashCode());
Class<? extends User> aClass1 = user1.getClass(); Class<? extends User> aClass2 = user2.getClass(); Class<? extends User> aClass3 = user3.getClass();
System.out.println(aClass1.hashCode()); System.out.println(aClass2.hashCode()); System.out.println(aClass3.hashCode()); } }
|
运行结果
1 2 3 4 5 6 7 8
| 460141958 1163157884 1956725890 685325104 685325104 685325104
Process finished with exit code 0
|
四种加载器
- 虚拟机自带的加载器
- 启动类(根)加载器
- 扩展加载器
- 应用程序(系统类)加载器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package demo01;
public class User {
public static void main(String[] args) { User user1 = new User(); Class<? extends User> aClass1 = user1.getClass(); ClassLoader classLoader = aClass1.getClassLoader(); System.out.println(classLoader); System.out.println(classLoader.getParent()); System.out.println(classLoader.getParent().getParent()); } }
|
运行结果
1 2 3 4 5
| sun.misc.Launcher$AppClassLoader@18b4aac2 sun.misc.Launcher$ExtClassLoader@1540e19d null
Process finished with exit code 0
|
双亲委派机制
执行步骤
- 类加载器收到请求
- 将这个请求向上委托给父类加载器完成,一直向上委托,直到启动类加载器
- 启动类加载器检查是否能够加载当前这个类,能加在就结束,使用当前加载器,否则抛出异常,通知子加载进行加载
- 重复步骤3
简单测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package java.lang;
public class String {
public String toString(){ return "Jokerdig"; }
public static void main(String[] args) { String str = new String(); str.toString(); } }
|
运行结果
1 2 3 4 5
| 错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application
Process finished with exit code 1
|