【java虚拟机】JVM知识框架快速一览
发布时间:2026/11/3 18:20:00 锦皓数字建站

文章目录一. JVM相关概念二. 运行时数据区三. GC垃圾回收四. 字节码与JVM类加载五. 调试与诊断六. 性能调优一. JVM相关概念JVM基础1java字节码文件-class文件到底是什么JVM基础4- JMMjava内存模型与线程安全JVM 基础3 - 面试高频JVM 内存结构栈、堆、逃逸分析、元空间还是永久代二. 运行时数据区运行时数据区及线程概述介绍运行时数据区的内部结构运行时数据区包括方法区、程序计数器、本地方法栈、堆区以及虚拟机栈。从线程的角度可以把运行时数据区分为线程私有和线程共享两部分程序计数器程序计数器可以看作是当前线程所执行的字节码的行号指示器指示着下一条将要执行的字节码指令。程序计数器是线程私有的各线程之间程序计数器互不干扰。虚拟机栈Java语言为什么基于栈结构进行设计以及栈帧与线程之间的关系。栈是由一个个的栈帧组成每个栈帧包括局部变量表、操作数栈、动态链接、方法返回地址和一些附加信息。其中局部变量表主要用于存储方法参数和定义在方法体内的局部变量slot是局部变量表中最基本的存储单元。操作数栈主要用于保存计算过程的中间结果同时作为计算过程中变量临时的存储空间。每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。方法返回地址中存储的是调用该方法的程序计数器的值当字节码指令执行到ireturn、lreturn、freturn、dreturn、areturn、return时该方法执行结束。最后详细介绍了方法调用的分类、虚方法、非虚方法、虚方法表等内容。本地方法接口Java为我们提供的简洁的本地方法接口不仅使我们无须去了解Java应用之外的烦琐细节还增加了Java语言的扩展性。本地方法栈本地方法栈用于管理本地方法的调用堆JVM的主要内存区域分为堆内存和非堆内存非堆内存在不同JDK版本中的实现是不一样的。堆内存区域又进行了细致的划分主要目的是为了优化垃圾收集。对象在堆内存中的分配过程和策略新生代是大部分对象诞生、成长和消亡的区域。对象在这里产生、应用最后被垃圾回收器收集、结束生命。老年代放置生命周期较长的对象通常都是从Survivor区域筛选复制过来的Java对象也可能是大对象直接分配到老年代。GC的分类当GC只发生在新生代中回收新生代对象的行为被称为Minor GC。当GC发生在老年代时则被称为Major GC或者Full GC。程序正常运行的情况下Minor GC的发生频率要比Major GC高很多即老年代中垃圾收集发生的频率要大大低于新生代垃圾收集的频率。JIT编译器通过逃逸分析来优化对象的分配经过逃逸分析之后的代码如果对象没有发生逃逸行为则可能会发生栈上分配、同步省略和标量替换行为。方法区了解运行时数据区中方法区、堆、栈之间的交互关系并详细讲解了方法区的相关知识。方法区(Method Area)是可提供各个线程共享的运行时内存区域它用于存储已被虚拟机加载的类型信息、常量、即时编译器编译后的代码缓存等。方法区的大小不必是固定的在JDK 8及之后是通过“-XX:MetaspaceSize”和“-XX:MaxMetaspaceSize”设置元空间的初始分配空间和最大分配空间。常量池和运行时常量池的存储内容。在JDK的版本升级中方法区也逐渐地进行着调整由永久代变成了元空间。方法区同样也是需要垃圾回收的主要回收常量池中废弃的常量和不再使用的类型信息。对象的实例化内存布局与访问定位了解多种创建对象的方式如使用new关键字、Class的newInstance()方法、Constructor类的newInstance()方法等。了解创建对象的步骤总共分为6步第1步是判断对象对应的类是否加载、链接、初始化第2步是为对象分配内存第3步是处理并发安全问题第4步是初始化分配到的空间第5步是设置对象的对象头第6步是执行init方法进行初始化。了解对象的内存布局并且使用案例讲解了对象在内存布局中的内容。访问对象的两种主流方式分别是使用句柄访问和使用指针访问其中经常使用的HotSpot虚拟机主要使用指针访问。直接内存直接内存的概念直接内存来源于NIO它是一块堆外内存这些内存直接受操作系统管理。从结果来看NIO的数据传输效率要比IO高说明直接内存的使用可以提高数据传输效率如果在读写频繁的场合可以考虑使用直接内存。直接内存不受JVM管理相对于堆内存来讲更加难以控制使用直接内存就意味着失去了JVM管理内存的可行性需要由开发人员管理所以在使用直接内存的时候要注意空间的释放。执行引擎执行引擎在JVM中起到的作用执行引擎充当了将class文件中的内容翻译为机器语言的译者使得物理机器可以识别进而使得程序可以执行。HotSpot VM中的执行引擎同时存在解释器和JIT编译器即代码可以解释执行也可以编译执行。从执行效率上讲编译执行要比解释执行的效率高。从JVM启动时间来看解释器可以首先发挥作用而不必等待JIT全部编译完成后再执行这样可以省去许多不必要的编译时间编译执行。字符串常量池String类的创建方式及其特性。字符串的分配和其他的对象分配一样耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销在实例化字符串常量的时候进行了一些优化使用字符串常量池实现对字符串常量对象的共享以节省大量的内存空间。三. GC垃圾回收垃圾收集概述垃圾收集相关算法垃圾收集相关概念垃圾收集器垃圾回收器基础可达性分析、方法区的回收、垃圾回收算法和GC策略四. 字节码与JVM类加载class文件结构字节码指令集与解析类的加载过程类加载器JVM基础2 - java类生命周期、类加载原理与自定义类加载器五. 调试与诊断命令行工具JVM监控及诊断工具JVM运行时参数GC日志分析OOM分类及解决方式【JVM】JVM堆占用情况分析(频繁创建的对象、内存泄露等问题)、jmapjhat、jvisualvm工具使用JVM内存性能调优思路之通过GC log、Thread Dump 、Heap Dump分析内存使用说明六. 性能调优针对 G1 JVM常用参数讲解-XX-X-D 的区别与常用JVM配置 应用程序配置实例 调优思路
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。