跳至主要內容
Java 虚拟机面试二

Java 虚拟机面试二

垃圾收集

【困难】如何判断 Java 对象是否可以被回收?

判断 Java 对象是否可以被回收有两种方法:

  • 引用计数法
  • 可达性分析法

引用计数法

引用计数算法(Reference Counting)的原理是:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。

引用计数算法简单高效,但是存在循环引用问题——两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。


钝悟...大约 22 分钟JavaJavaCore面试JavaJavaCore面试JVM
《极客时间教程 - 深入拆解 Java 虚拟机》笔记

《极客时间教程 - 深入拆解 Java 虚拟机》笔记

开篇词 为什么我们要学习 Java 虚拟机?

Java 代码是怎么运行的?

从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。


钝悟...大约 25 分钟笔记JavaJavaJVM
《极客时间教程 - 深入浅出 Java 虚拟机》笔记

《极客时间教程 - 深入浅出 Java 虚拟机》笔记

开篇词:JVM,一块难啃的骨头

一探究竟:为什么需要 JVM?它处在什么位置?

JVM - Java Virtual Machine 的缩写,即 Java 虚拟机。JVM 是运行 Java 字节码的虚拟机。JVM 不理解 Java 源代码,这就是为什么要将 *.java 文件编译为 JVM 可理解的 *.class 文件(字节码)。Java 有一句著名的口号:“Write Once, Run Anywhere(一次编写,随处运行)”,JVM 正是其核心所在。实际上,JVM 针对不同的系统(Windows、Linux、MacOS)有不同的实现,目的在于用相同的字节码执行同样的结果。


钝悟...大约 8 分钟笔记JavaJavaJVM
Java 虚拟机面试一

Java 虚拟机面试一

JVM 简介

【中等】JVM 由哪些部分组成?

类加载→内存分配→执行引擎运行→GC 回收内存,通过 JNI 与外部交互。

JVM(Java 虚拟机)主要由以下核心部分组成:

  • 类加载子系统:负责加载、验证、准备、解析和初始化类文件(.class)。
  • 运行时数据区
    • 方法区:存储类元数据、常量池等。
    • :存放对象实例(主 GC 区域)。
    • 虚拟机栈:存储方法调用的栈帧(局部变量、操作数栈等)。
    • 本地方法栈:为 Native 方法服务。
    • 程序计数器:记录当前线程执行的字节码位置。
  • 执行引擎:解释或编译字节码为机器码执行(含 JIT 编译器)。
    • 解释器(Interpreter):逐行解释执行字节码(启动快,执行慢)。
    • 即时编译器(JIT Compiler):将热点代码(频繁执行的代码)编译为本地机器码(如 HotSpot 的 C1、C2 编译器)。
    • 垃圾回收器(GC):自动回收堆中无用的对象(如 Serial、Parallel、G1、ZGC 等算法)。
  • 本地方法接口(JNI):调用 C/C++实现的 Native 方法。
  • 本地方法库(Native Libraries):由其他语言(如 C/C++)编写的库,供 JNI 调用(如文件操作、网络通信等底层功能)。

钝悟...大约 31 分钟JavaJavaCore面试JavaJavaCore面试JVM
Java 虚拟机简介

Java 虚拟机简介

JVM 能跨平台工作,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件、硬件之间的差异。

JVM 简介

计算机体系结构

真实的计算机体系结构的核心部分包含:

  • 指令集
  • 计算单元(CPU)
  • 寻址方式
  • 寄存器
  • 存储单元

JVM 体系结构简介

JVM 体系结构与计算机体系结构相似,它的核心部分包含:


钝悟...大约 3 分钟JavaJavaCoreJVMJavaJavaCoreJVM
Java 虚拟机之工具

Java 虚拟机之工具

JVM 命令行工具

Java 程序员免不了故障排查工作,所以经常需要使用一些 JVM 工具。

JDK 自带了一些实用的命令行工具来监控、分析 JVM 信息,掌握它们,非常有助于 TroubleShooting。

以下是较常用的 JDK 命令行工具:

名称 描述
jps 虚拟机进程状况工具。显示系统内的所有 JVM 进程。
jstat JVM 统计监控工具。监控虚拟机运行时状态信息,它可以显示出 JVM 进程中的类装载、内存、GC、JIT 编译等运行数据。
jmap JVM 堆内存分析工具。用于打印 JVM 进程对象直方图、类加载统计。并且可以生成堆转储快照(一般称为 heapdump 或 dump 文件)。
jstack JVM 栈查看工具。用于打印 JVM 进程的线程和锁的情况。并且可以生成线程快照(一般称为 threaddump 或 javacore 文件)。
jhat 用来分析 jmap 生成的 dump 文件。
jinfo JVM 信息查看工具。用于实时查看和调整 JVM 进程参数。
jcmd JVM 命令行调试 工具。用于向 JVM 进程发送调试命令。

钝悟...大约 34 分钟JavaJavaCoreJVMJavaJavaCoreJVM命令行
Java 虚拟机之故障处理

Java_虚拟机_故障处理

故障定位思路

Java 应用出现线上故障,如何进行诊断?

我们在定位线上问题时要有一个整体的思路,顺藤摸瓜,才能较快的找到问题原因。

一般来说,服务器故障诊断的整体思路如下:

img
img

钝悟...大约 17 分钟JavaJavaCoreJVMJavaJavaCoreJVM故障诊断
Java 虚拟机之内存区域

Java 虚拟机之内存区域

运行时数据区域

JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。如下图所示:


钝悟...大约 39 分钟JavaJavaCoreJVMJavaJavaCoreJVM
Java 虚拟机之类加载

Java 虚拟机之类加载

类加载机制

类是在运行期间动态加载的。

类的加载指的是将类的 .class 文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向 Java 程序员提供了访问方法区内的数据结构的接口。


钝悟...大约 21 分钟JavaJavaCoreJVMJavaJavaCoreJVM
Java 虚拟机之垃圾收集

Java 虚拟机之垃圾收集

程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。垃圾回收主要是针对 Java 堆和方法区进行

对象是否回收

引用计数算法

引用计数算法(Reference Counting)的原理是:在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。


钝悟...大约 31 分钟JavaJavaCoreJVMJavaJavaCoreJVMGC
2