【狂神说】JVM

本文详细介绍了JVM在Java程序中的位置、体系结构、类加载器、双亲委派机制、沙箱安全机制、native方法、PC寄存器、方法区、栈、堆内存的管理以及不同区域的调优。同时,探讨了JVM的垃圾回收算法,并提到了JMM(Java内存模型)及其作用。此外,文章还讨论了如何学习和理解JVM以及应对面试的方法。
摘要由CSDN通过智能技术生成


常见的面试题:

  • 请谈一谈你对JVM的理解?Java8虚拟机和之前的变化?
  • 什么是OOM,什么是栈溢出?
  • JVM的常用调优参数有哪些
  • 内存快照如何抓取,怎么分析Dump文件?
  • 谈谈JVM中你认识的类加载器

1.JVM的位置

类加载子系统:加载、链接、初始化

第三方插件:执行引擎处

请添加图片描述

在这里插入图片描述

Class File–javac

在这里插入图片描述

在这里插入图片描述

2.JVM的体系结构

Java栈、本地方法栈、程序计数器不会有垃圾回收,否则程序会死掉
百分之99的JVM调优都是在方法区和堆(99%是堆)中调优,Java栈、本地方法栈、程序计数器是不会有垃圾存在的。

3.类加载器

请添加图片描述

作用:加载class文件 new Student();

(有一个student的类,这个类是抽象的,当使用new关键词new完后变成具体的实例,具体的实例在Java在栈中引用,具体的人实例放在堆中,要去堆中进行真正的数据引用)

类是模板,是抽象的,类实例化得到的对象是具体的。所有的对象反射回去得到的是同一个类模板。

请添加图片描述

  1. 虚拟机自带的加载器
  2. 启动类(根)加载器 BootstrapClassLoader(rt.jar):主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
  3. 扩展类加载器  ExtClassLoader(\jre\lib\ext):主要负责加载jre/lib/ext目录下的一些扩展的jar。
  4. 应用程序加载器  AppClassLoader(当前应用程序加载器):主要负责加载应用程序的主函数类
  5. 百度:双亲委派机制

4.双亲委派机制(重要)

请添加图片描述

请添加图片描述

工作原理:

(1)如果一个类加载器收到了类加载请求,它并不会自己先加载,而是把这个请求委托给父类的加载器去执行

(2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的引导类加载器;

(3)如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制

(4)父类加载器一层一层往下分配任务,如果子类加载器能加载,则加载此类,如果将加载任务分配至系统类加载器也无法加载此类,则抛出异常

请添加图片描述

当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,

首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。

如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。

父类中同理也会先检查自己是否已经加载过,如果没有再往上。

注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。那么有人就有下面这种疑问了?

为什么要设计这种机制?

这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(为什么?因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其他类加载器并没有机会再去加载,从一定程度上防止了危险代码的植入。


举例一、

我自己建立一个 java.lang.String 类,写上 static 代码块

package java.lang;

public class String {
   
    static{
   
        System.out.println("我是自定义的String类的静态代码块");
    }
}

在另外的程序中加载 String 类,看看加载的 String 类是 JDK 自带的 String 类,还是我们自己编写的 String 类

public class StringTest {
   

    public static void main(String[] args) {
   
        java.lang.String str 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值