JAVA虚拟机-JVM

了解类加载的完整过程吗?

  • 类加载过程可以分为加载、链接和初始化三个阶段,其中链接阶段可以划分为验证、准备和解析三个子阶段。
  1. 在加载阶段,类加载器负责查找类的字节码文件并将其加载到内存中。
  2. 链接(Linking) 包含三个子阶段:验证、准备、解析
    • 验证(Verification):在验证阶段,会确保加载的类文件格式正确,并且不包含不安全的构造。
    • 准备(Preparation):在准备阶段,在内存中为类的静态变量分配内存空间,并设置默认初始值。
    • 解析(Resolution):在解析阶段,会将类、接口、字段和方法的符号引用解析为直接引用,也就是内存地址。
  3. 在初始化阶段,执行类的静态初始化代码,包括静态字段的赋值和静态代码块的执行。静态初始化在类的首次使用时进行,可以是创建实例、访问静态字段或调用静态方法。

类初始化时,静态代码块、静态常量、复合函数的执行顺序是什么?

  1. final static作为编译期常量在编译时会被存入调用类的常量池,类加载阶段中的链接阶段进行内存分配与赋值;
  2. 静态变量的赋值和静态代码块则是在初始化阶段执行,二者的执行顺序是代码编写的先后顺序;
  3. 复合函数(静态方法)属于方法调用,静态方法不会在类初始化阶段自动执行,如果静态变量通过调用静态方法赋值,此时方法会随变量赋值执行。

请讲解JVM的内存结构?

  1. JVM内存结构(运行时数据区)可以分为Java虚拟机栈、堆、方法区、本地方法栈和程序计数器五个部分。在JDK8之前,方法区通过永久代实现,JDK8及以后,永久代被元空间取代。
  2. 其中堆和方法区是线程共享的,虚拟机栈、程序计数器和本地方法栈是线程私有的。
  3. Java虚拟机栈存储方法执行时的栈帧,用来存储局部变量、操作数栈动态链接和返回地址,每个线程的虚拟机栈生命周期和线程相同;堆存放对象的实例和数组,是垃圾回收的主要区域;本地方法栈登记本地方法,管理本地方法的调用;程序计数器记录当前线程执行的字节码指令地址;方法区保存已经被加载的类信息、静态变量和即时编译后的代码等数据,关闭JVM后释放。

常见的垃圾回收器有哪些?

  1. Serial:新生代单线程收集器,使用复制算法,简单高效
  2. Serial Old:老年代单线程收集器,使用标记-整理算法
  3. ParNew:新生代并行收集器,使用复制算法,在多核CPU环境下比Serial好
  4. Parallel Scavenge收集器:新生代并行收集器,使用复制算法,追求高吞吐量。
  5. Parallel Old收集器:老年代并行收集器,使用标记-整理算法,吞吐量优先。
  6. CMS(Concurrent Mark Sweep) 收集器:老年代并行收集器,使用标记-清除算法,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。
  7. G1收集器:Java堆并行收集器,使用标记-整理算法,不会产生内存碎片。

了解JVM的相关参数吗?请举例说明。

JVM参数为JVM运行提供配置依据,可以对内存分配、垃圾回收、日志等方面进行配置,为不同的业务场景选择合适的参数。

  1. 进行内存配置时可以使用-Xms和-Xmx设置堆内存的初始值和最大值;-Xmn设置新生代大小,-XX:NewRatio设置老年代与新年代比例;
  2. 进行垃圾回收时可以使用-XX:+UseParallelGC、-XX:+UseConcMarkSweepGC、-XX:+UseG1GC等参数进行垃圾回收器的选择。
  3. 关于日志可以使用-XX:PrintGCDetails打印GC详细信息,使用-XX:PrintGCDateStamps打印GC日期和时间,还可以使用-Xloggc:/path/to/gc-%t.log打印GC日志到指定文件。%t表示当前时间。
  4. JVM参数也可以处理OOM异常,使用-XX:+HeapDumpOnOutOfMemoryError可以在OOM时自动生成堆快照,使用-XX:HeapDumpPath=/path/to/heapdump.hprof可以指定堆快照文件路径。
相关推荐
ldj20201 分钟前
Arthas常用方式
jvm·arthas
炸膛坦客1 分钟前
单片机/C语言八股:(十三)C 语言实现矩阵乘法
c语言·开发语言·矩阵
小小小米粒9 分钟前
Redisson 大量用了 Lua
java
free-elcmacom13 分钟前
C++ 函数占位参数与重载详解:从基础到避坑
java·前端·算法
Greenland_1215 分钟前
Android Java使用Glide无法生成GlideApp
android·java·glide
为你奋斗!26 分钟前
Playwright 录屏功能启用离线安装依赖pywin32 pillow
开发语言·chrome·python·语言模型·迁移学习
郝学胜-神的一滴26 分钟前
CMake:解锁C++跨平台工程构建的核心密钥
开发语言·c++·职场和发展
zh路西法26 分钟前
【宇树机器人强化学习】(二):ActorCritic网络和ActorCriticRecurrent网络的python实现与解析
开发语言·python·深度学习·机器学习·机器人
沐知全栈开发28 分钟前
MVC 控制器
开发语言