JVM知识点梳理

目录标题

  • 1.类加载机制
    • 1.1 Java 运行时一个类是什么时候被加载的?
    • 1.2 JVM 一个类的加载过程?
    • 1.3 一个类被初始化的过程?
    • 1.4 继承时父子类的初始化顺序是怎样的?
    • 1.5 究竟什么是类加载器?
    • 1.6 JVM 有哪些类加载器?
    • 1.7 JVM 中不同的类加载器加载哪些文件?
    • 1.8 JVM 三层类加载器之间的关系是继承吗?
    • 1.9 你了解 JVM 类加载的双亲委派模型吗?
    • 1.10 JDK 为什么要设计双亲委派模型,有什么好处?
    • 1.11 可以打破JVM 双亲委派模型吗?如何打破JVM 双亲委派模型?
    • 1.12 如何自定义自己的类加载器?
    • 1.13 ClassLoader 中的 loadClass()、findClass()、defineClass()区别?
    • 1.14 Tomcat 的类加载机制吗?
    • 1.15 为什么 Tomcat 要破坏双亲委派模型?
    • 1.16 有没有听说过热加载和热部署,如何自己实现一个热加载?
    • 1.17 加载一个类采用 Class.forName()和 ClassLoader 有什么区别?
  • 2.深入剖析 JVM 内存管理
    • 1.画一下 JVM 整个运行原理图?
    • 2. 请介绍一下 JVM 的内存结构划分?
    • 3.JVM 哪些区域是线程私有的,哪些区域是线程共享的?
    • 4.JVM 运行时数据区 程序计数器 的特点及作用?
    • 5.JVM 运行时数据区 虚拟机栈的特点及作用?
    • 6.JVM 运行时数据区 本地方法栈的特点及作用?
    • 7 JVM 运行时数据区 Java 堆的特点及作用?
    • 8.JVM 中对象如何在堆内存分配?
    • 9.JVM 堆内存中的对象布局?
    • 10.JVM 什么情况下会发生堆内存溢出?
    • 11.JVM 如何判断对象可以被回收?
    • 12.谈谈 Java 中不同的引用类型?
    • 13.JVM 堆内存分代模型?
    • 14.请介绍一下 JVM 堆中新生代的垃圾回收过程?
    • 15.JVM 对象动态年龄判断是怎么回事?
    • 16.什么是老年代空间分配担保机制
    • 16.什么情况下对象会进入老年代?
    • 17.JVM 运行时数据区元空间的特点及作用?
    • 18.JVM 本机直接内存的特点及作用?
    • 19.JVM 本机直接内存溢出问题?
    • 20.说几个与 JVM 内存相关的核心参数?
  • 3.垃圾回收器
    • 1.堆为什么要分成年轻代和老年代?
    • 2.JVM 堆的年轻代为什么要有两个 Survivor 区?
    • 3.Eden 区与 Survivor 区的空间大小比值为什么默认是 8:1:1?
    • 4 请介绍下 JVM 中的垃圾回收算法?
      • 1.标记-清除算法
          • 标记
          • 清除
      • 2.复制算法
      • 3.标记整理算法
      • 4 分代收集算法
    • 5.请介绍一下 JVM 垃圾收集器?
      • 1.Serial 收集器
      • 2. ParNew 收集器
      • 3.Parallel Scavenge 收集器
      • 4.Serial Old 收集器
      • 5.Parallel Old 收集器
      • 6.CMS 收集器
      • 7.G1 收集器
        • 1.G1 垃圾收集器的基本原理
        • 2.G1 垃圾收集器如何做到可预测的停顿时间?
        • 3.G1 垃圾收集器是否还有年代的划分?
        • 4.G1 垃圾收集器中的大对象?
        • 5.G1 垃圾收集器内存大小如何设置?
        • 6.G1 垃圾收集器新生代还有 Eden 和 Survivor 吗?
        • 7.G1 垃圾收集器的新生代垃圾回收
        • 8.G1 垃圾收集器的老年代垃圾回收
        • 9.G1 垃圾收集器的混合垃圾回收?
        • 10.G1 回收失败时的 Full GC
        • 11.什么时候使用 G1 垃圾收集器?
      • 8. ZGC 收集器
      • 9.Shenandoah 收集器
      • 10.项目所用jvm实例
  • 6.JVM 故障诊断性能调优实战
    • 1.什么是内存泄漏?什么是内存溢出?
    • 2.线上环境的 JVM 都设置多大?
    • 3.线上 Java 服务器内存飙升怎么回事?
    • 4.线上 Java 项目 CPU 飙到 100%怎么排查?
    • 5 JVM 堆溢出后,其他线程是否可以继续工作?
    • 6. 线上 Java 项目 OOM 了,怎么回事?
    • 7. 某一天晚上,线上 Java 服务器宕机了,怎么 回事?
    • 8.jvm调优?

1.类加载机制

1.1 Java 运行时一个类是什么时候被加载的?

一个类在什么时候开始被加载,《Java 虚拟机规范》中并没有进行强制约束,交给了虚拟机自己去自由实现HotSpot 虚拟机是按需加载,在需要用到该类的时候加载这个类
1、Sun 公司最早的 Classic 虚拟机;
2、Sun/Oracle 公司的 HotSpot 虚拟机; 3、BEA 公司的 JRockit 虚拟机;
4、IBM 公司的 IBM J9 虚拟机;
官方:https://docs.oracle.com/javase/8/
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-XX:+TraceClassLoading

Java虚拟机(JVM)在以下几个关键时刻会加载一个类:

  1. 使用类的静态成员:当首次访问类的静态变量或调用静态方法时。
  2. 实例化类:当使用new关键字创建类的实例时。
  3. 反射:当使用反射机制,如调用Class.forName或ClassLoader.loadClass时。
  4. 初始化子类:在初始化子类时,如果父类还没有被加载,会首先加载父类。
  5. 启动类:JVM启动时,会加载启动类,即包含main方法的类。

1.2 JVM 一个类的加载过程?

一个类从加载到 jvm 内存,到从 jvm 内存卸载,它的整个生命周期会经历 7 个阶段:
1、加载(Loading)
2、验证(Verification) 3、准备(Preparation) 4、解析(Resolution)
5、初始化(Initialization) 6、使用(Using)
7、卸载(Unloading)
其中验证、准备、解析三个阶段统称为连接(Linking);
在这里插入图片描述
加载:classpath、jar 包、网络、某个磁盘位置下的类的 class 二进制字节流读进来,在内存中生成一个代表这个类的 java.lang.Class 对象放入元空间,此阶段我们程序员可以干预,我们可以自定义类加载器来实现类的加载;

验证:验证 Class 文件的字节流中包含的信息符合《Java 虚拟机规范》的全部约束要求,保证虚拟机的安全;

准备:类变量赋默认初始值,int 为 0,long 为 0L,boolean 为 false,引用类型为 null;常量赋正式值;

解析:把符号引用翻译为直接引用;

初始化:当我们 new 一个类的对象,访问一个类的静态属性,修改一个类的静态属性,调用一个类的静态方法,用反射 API 对一个类进行调用,初始化当前类,其父类也会被初始化 那么这些都会触发类的初始化;

使用:使用这个类;

卸载

  1. 该类所有的实例都已经被 GC,也就是 JVM 中不存在该 Class 的任何实例;
  2. 加载该类的 ClassLoader 已经被 GC;
  3. 该类的 java.lang.Class 对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法;

1.3 一个类被初始化的过程?

在这里插入图片描述
类的初始化阶段,Java 虚拟机才真正开始执行类中编写的 Java 程序代码;

进行准备阶段时,变量已经赋过一次系统要求的初始零值,而在初始化阶段,才真正初始化类变量和其他资源;

1.4 继承时父子类的初始化顺序是怎样的?

父类–静态变量
父类–静态初始化块子类–静态变量
子类–静态初始化块父类–变量
父类–初始化块父类–构造器 子类–变量
子类–初始化块子类–构造器
(静态代码块或静态变量其实按照代码顺序加载)

1.5 究竟什么是类加载器?

在这里插入图片描述
在类"加载"阶段,通过一个类的全限定名来获取描述该类的二进制字节流的这个动作的“代码”被称为“类加载器(Class Loader)”,这个动作是可以自定义实现的;

1.6 JVM 有哪些类加载器?

站在 Java 虚拟机的角度来看,只存在两种不同的类加载器:
1、启动类加载器(Bootstrap ClassLoader),使用 C++语言实现,是虚拟机自身的一部分;
2、其他所有的类加载器,由 Java 语言实现,独立存在于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader;站在 Java 开发者的角度来看,自 JDK 1.2 开始,Java 一直保持着三层类加载器架构;

在这里插入图片描述

1.7 JVM 中不同的类加载器加载哪些文件?

1、启动类加载器(Bootstrap ClassLoader):(根的类加载器)C++语言实现的
<JAVA_HOME>\jre\lib\rt.jar,resources.jar、charsets.jar被-Xbootclasspath 参数所指定的路径中存放的类库;

2、扩展类加载器(Extension ClassLoader):
sun.misc.Launcher$ExtClassLoader,<JAVA_HOME>\jre\lib\ext,
被 java.ext.dirs 系统变量所指定的路径中所有的类库;

3、应用程序类加载器(Application ClassLoader):系统的类加载器
sun.misc.Launcher$AppClassLoader
加载用户类路径(ClassPath)上所有的类库;

1.8 JVM 三层类加载器之间的关系是继承吗?

在这里插入图片描述
JVM的三层类加载器之间的关系不是继承关系,而是通过委托模型实现的。这种设计确保了类加载的顺序和安全性,避免类重复加载和冲突。通过委托模型,类加载请求从下到上逐层委托,直到找到合适的类加载器来加载指定的类

1.9 你了解 JVM 类加载的双亲委派模型吗?

在这里插入图片描述
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当上一层类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到这个类)时,下一层类加载器才会尝试自己去加载;

1.10 JDK 为什么要设计双亲委派模型,有什么好处?

1. 确保安全,避免 Java 核心类库被修改;

2、避免重复加载;

3、保证类的唯一性;

如果你写一个 java.lang.String 的类去运行,发现会抛出如下异常;
在这里插入图片描述

1.11 可以打破JVM 双亲委派模型吗?如何打破JVM 双亲委派模型?

可以;
想要打破这种模型,那么就自定义一个类加载器,重写其中的 loadClass 方法,使其不进行双亲委派即可;

1.12 如何自定义自己的类加载器?

1、继承 ClassLoader

2、覆盖 findClass(String name)方法 或者 loadClass() 方法; findClass(String name)方法 不会打破双亲委派;
loadClass() 方法 可以打破双亲委派;

1.13 ClassLoader 中的 loadClass()、findClass()、defineClass()区别?

loadClass() 就是主要进行类加载的方法,默认的双亲委派机制就实现在这个方法中;

findClass() 根据名称或位置加载.class 字节码;

definclass() 把字节码转化为 java.lang.Class;

1、当我们想要自定义一个类加载器的时候,并且想破坏双亲委派模型时,我们会重写 loadClass()方法;

2、如果我们想定义一个类加载器,但是不想破坏双亲委派模型的时候呢?可以可以重写 findClass 方法(),findClass()方法是 JDK1.2 之后的 ClassLoader 新添加的一个方法,这个方法只抛出了一个异常,没有默认实现;
JDK1.2 之后已不再提倡用户直接覆盖 loadClass()方法,而是建议把自己的类加载逻辑实现到 findClass()方法中;
所以, 如果你想定义一个自己的类加载器, 并且要遵守双亲委派模型, 那么可以继承 ClassLoader,并且在 findClass()中实现你自己的加载逻辑即可;

1.14 Tomcat 的类加载机制吗?

在这里插入图片描述
可以看到,在原来的 Java 的类加载机制基础上,Tomcat 新增了 3 个基础类加载器和每个 Web 应用的类加载器+JSP 类加载器;
3 个基础类加载器在 conf/catalina.properties 中进行配置:
common.loader=“ c a t a l i n a . b a s e / l i b " , " {catalina.base}/lib"," catalina.base/lib","{catalina.base}/lib/.jar"," c a t a l i n a . h o m e / l i b " , " {catalina.hom e}/lib"," catalina.home/lib","{catalina.home}/lib/.jar”
server.loader= shared.loader=
Tomcat 自定义了 WebAppClassLoader 类加载器,打破了双亲委派的机制,即如果收到类加载的请求,首先会尝试自己去加载,如果找不到再交给父加载器去加载,目的就是为了优先加载 Web 应用自己定义的类,我们知道 ClassLoader 默认的 loadClass 方法是以双亲委派的模型进行加载类的,那么 Tomcat 打破了这个规则,重写了 loadClass 方法,我们可以看到

WebAppClassLoader 类中重写了 loadClass 方法;

1.15 为什么 Tomcat 要破坏双亲委派模型?

Tomcat 是 web 容器,那么一个 web 容器可能需要部署多个应用程序;
1、部署在同一个 Tomcat 上的两个 Web 应用所使用的 Java 类库要相互隔离;
2、部署在同一个 Tomcat 上的两个 Web 应用所使用的 Java 类库要互相共享;
3、保证 Tomcat 服务器自身的安全不受部署的 Web 应用程序影响;
4、需要支持 JSP 页面的热部署和热加载;

1.16 有没有听说过热加载和热部署,如何自己实现一个热加载?

热加载 是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环境;

热部署 是指可以在不重启服务的情况下重新部署整个项目,比如 Tomcat 热部署就是在程序运行时,如果我们修改了 War 包中的内容,那么 Tomcat 就会删除之前的 War 包解压的文件夹,重新解压新的 War 包生成新的文件夹;

1、热加载是在运行时重新加载 class,后台会启动一个线程不断检测你的 class 是否发生改变;
2、热部署是在运行时重新部署整个项目ÿ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/378181.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于LSTM及其变体的回归预测

1 所用模型 代码中用到了以下模型&#xff1a; 1. LSTM&#xff08;Long Short-Term Memory&#xff09;&#xff1a;长短时记忆网络&#xff0c;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xff0c;能够解决传统RNN在处理长序列时出现的梯度消失或爆炸的问题。L…

动手学深度学习6.3 填充和步幅-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;填充和步幅_哔哩哔哩_bilibili 代码实现_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.3. 填充和…

笔记 5 :linux 0.11 注释,函数 copy_mem() , copy_process () , 中断函数 int 80H 的代码框架

&#xff08;38&#xff09;接着介绍一个创建进程时的重要的函数 copy_mem&#xff08;&#xff09; 函数&#xff1a; &#xff08;39&#xff09; 分析另一个关于 fork&#xff08;&#xff09; 的重要的函数 copy_process&#xff08;&#xff09;&#xff0c;与李忠老师的操…

Qcom平台通过Hexagon IDE 测试程序性能指导

Qcom平台通过Hexagon IDE 测试程序性能指导 1 安装Hexagon IDE工具2 测试工程2.1 打开Hexagon IDE2.2 新建工程2.3 添加测试案例2.3.1 方法一&#xff1a;新建2.3.2 方法二&#xff1a;拷贝 2.4 配置测试环境2.4.1 包含头文件2.4.2 添加程序优化功能(需先bulid一下)2.4.3 添加g…

【问题记录】Docker配置mongodb副本集实现数据流实时获取

配置mongodb副本集实现数据流实时获取 前言操作步骤1. docker拉取mongodb镜像2. 连接mongo1镜像的mongosh3. 在mongosh中初始化副本集 注意点 前言 由于想用nodejs实现实时获取Mongodb数据流&#xff0c;但是报错显示需要有副本集的mongodb才能实现实时获取信息流&#xff0c;…

HTTPS请求头缺少HttpOnly和Secure属性解决方案

问题描述&#xff1a; 建立Filter拦截器类 package com.ruoyi.framework.security.filter;import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.…

某客户管理系统Oracle RAC节点异常重启问题详细分析记录

一、故障概述 某日10:58分左右客户管理系统数据库节点1所有实例异常重启&#xff0c;重启后业务恢复正常。经过分析发现&#xff0c;此次实例异常重启的是数据库节点1。 二、故障原因分析 1、数据库日志分析 从节点1的数据库日志来看&#xff0c;10:58:49的时候数据库进程开始…

1.MQ介绍

MQ 消息队列&#xff0c;本质是一个队列&#xff0c;先进先出&#xff0c;只不过队列中存放的内容是message而已。 为啥学习MQ 1.流量消峰 如果一个订单系统最多每秒能处理一万次订单&#xff0c;正常情况下我们下单1秒后就能返回结果。但是在高峰期&#xff0c;如果有两万…

Linux驱动开发笔记(十九)文件系统的构建

文章目录 前言一、文件系统1.1 Linux系统的组成1.2 什么是文件系统 二、根文件系统的制作工具三、busybox3.1 什么是busybox3.2 制作流程 四、buildroot4.1 什么是Buildroot4.2 制作流程 前言 上节我们在mdev实验进行配置时&#xff0c;利用了busybox&#xff0c;这里着重对这部…

活动预告|想更了解流式数据湖?亚马逊云科技数据开源软件-流式数据湖 Tech Talk来啦!

活动介绍 本次活动旨在探索在亚马逊云科技上构建和使用开源数据软件产品的一些最佳实践&#xff0c;特别关注流式数据湖的构建。活动将在线上举行&#xff0c;汇聚来自 AutoMQ Apache paimon和亚马逊云科技的顶尖专家&#xff0c;分享他们在这一领域的最新进展和实际经验。参与…

旗晟巡检机器人的应用场景有哪些?

巡检机器人作为现代科技的杰出成果&#xff0c;已广泛应用于各个关键场景。从危险的工业现场到至关重要的基础设施&#xff0c;它们的身影无处不在。它们以精准、高效、不知疲倦的特性&#xff0c;担当起保障生产、守护安全的重任&#xff0c;为行业发展注入新的活力。那么&…

2024华为数通HCIP-datacom最新题库(变题更新⑥)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

【Elasticsearch7】3-基本操作

目录 RESTful 数据格式 HTTP操作 索引操作 倒排索引 创建索引 查看所有索引 查看单个索引 删除索引 文档操作 创建文档 查看文档 ​编辑 全量修改 ​编辑局部修改 删除文档 条件删除文档 高级查询 条件查询 URL带参查询 请求体带参查询 带请求体方式的查…

使用GPT3.5,LangChain,FAISS和python构建一个本地知识库

引言 介绍本地知识库的概念和用途 在现代信息时代&#xff0c;我们面临着海量的数据和信息&#xff0c;如何有效地管理和利用这些信息成为一项重要的任务。本地知识库是一种基于本地存储的知识管理系统&#xff0c;旨在帮助用户收集、组织和检索大量的知识和信息。它允许用户…

java8新特性

目录 一. lambda 1. 为什么要有lambda 2.功能接口 3. 使用lambda的条件 二. Stream流 1. 获取流 1.1 将集合转为流 1.2 将数组转为流 1.3 将相同数据类型的数据转为流 1.4 将文件里的内容转为流 2. 中间操作 3. 终端操作 一. lambda lambda:本质上就是将函数当做参…

Python | Leetcode Python题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:m, n len(matrix), len(matrix[0])x, y 0, n - 1while x < m and y > 0:if matrix[x][y] target:return Trueif matrix[x][y] > tar…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中&#xff0c;语言是连接我们的桥梁。印尼语翻译通&#xff0c;一款专为打破语言障碍而生的智能翻译软件&#xff0c;让您与印尼语的世界轻松接轨。无论是商务出差、学术研究&#xff0c;还是探索印尼丰富的文化遗产&#xff0c;印尼语翻译通都是您的…

基于luckysheet实现在线电子表格和Excel在线预览

概述 本文基于luckysheet实现在线的电子表格&#xff0c;并基于luckyexcel实现excel文件的导入和在线预览。 效果 实现 1. luckysheet介绍 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 官方文档在线Demo 2. 实现 …

抖音seo短视频矩阵源码系统开发搭建----开源+二次开发

抖音seo短视频矩阵源码系统开发搭建 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言&#xff0c;如Java、Python等。同时&#xff0c;需要使用一些框架和技术&#xff0c;如Hadoop、Spark、PyTorch等&am…

小程序-设置环境变量

在实际开发中&#xff0c;不同的开发环境&#xff0c;调用的接口地址是不一样的 例如&#xff1a;开发环境需要调用开发版的接口地址&#xff0c;生产环境需要正式版的接口地址 这时候&#xff0c;我们就可以使用小程序提供了 wx.getAccountInfoSync() 接口&#xff0c;用来获取…