深入理解JVM之二

简介: 深入理解JVM之二

javac 编译


将源码编译成字节码

image.png


字节码加载过程


image.png


加载


将字节码加载到方法区

由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部
并存储在运行时内存区的方法区
(整个代码当成模版放在方法代码、方法数据、静态变量中)


image.png


类加载器

双亲委派机制:
主要是沙箱安全机制
防止核心类库被修改
避免类的重复加载
保证被加载类的唯一性


image.png

类元信息包括

类型信息
类型的常量池
字段信息
方法信息
类加载器的引用
Class实例引用
方法表

常量池包括

字面量
文本字符串
final常量值
基本数据类型
其他符号引用
类和结构的全限定名
字段名称和描述符
方法名称和描述符

加载阶段实例化对象

将加载到的数据转换为一个与目标类型对应的java.lang.Class对象实例(对象存放在堆中,对象和方法区之间有一个指针引用)
这个Class对象在日后就会作为方法区中该类的各种数据访问入口

image.png



验证


运行final是否合规
类型是否正确
静态变量是否合法等校验操作


准备


为静态变量分配内存并初始化默认值


解析


解析类的方法确保类与类之间的相互引用正确性,完成内存结构布局


初始化


静态变量初始化

image.png

该方法的作用就是初始化一个类中的变量
使用用户指定的值覆盖之前在准备阶段设定的初始值 
任何invoke之类的字节码都无法调用<clinit>方法 
因为该方法只能在类加载的过程中由JVM调用

父类优先初始化

如果父类还没有被初始化,那么优先初始化父类,但在<clinit>方法内部不会显示调用父类的<clinit>方法,由JVM负责保证一个类的<clinit>方法执行之前,它的父类<clinit>方法已经被执行

JVM保证初始化时的数据安全

JVM必须确保一个类在初始化的过程中
如果多线程需要同时初始化它
仅仅只能允许其中一个线程对其执行初始化操作
其余线程必须等待
只有在活动线程执行完对类的初始化操作之后
才会通知正在等待的其他线程


使用


使用的过程就是在方法区和新生代本地方法栈中执行代码的过程


卸载


GC垃圾回收


本地方法栈


image.png

当前线程执行main方法,main方法中调用subfun方法
在当前线程所在的本地方法栈中 有2个栈桢
sunfunc的方法出口指向了main的栈桢 说明执行完subfunc方法
就会回到main方法继续执行其他
程序计数器中存放的是线程执行方法代码的位置


局部变量表


用于存boolean、char、short、int、float、long、double等类型的数据 
以变量槽为最小单位 long和double需要两个slot 所以线程不安全 
基本数据类型会直接存储值 引用数据类型会存放对象的引用


操作数栈


用于计算时的临时数据存储区、使用load执行将数据加载到此处


动态链接


动态链接(多态,编译器没有指明 运行时才会指明)指向常量池中的方法引用


方法出口


记录出栈地址即方法返回地址或异常地址


运行时数据区


image.png


堆区分为新生代和老年代 空间比例1:2
新生代分为 Eden和S0和S1 空间比例 8:1:1
Eden区存放的都是早生夕死的对象
经过一次垃圾回收如果该对象和跟对象是可达的 
那么就不会被回收 就转移到S0或S1区
S0和S1同一时刻只有有一个是有数据的 
另外一个是空的
对象的动态年龄如果达到15就会转移到老年代


垃圾回收


image.png


相关文章
|
1月前
|
监控 Java 编译器
Java虚拟机调优实战指南####
本文深入探讨了Java虚拟机(JVM)的调优策略,旨在帮助开发者和系统管理员通过具体、实用的技巧提升Java应用的性能与稳定性。不同于传统摘要的概括性描述,本文摘要将直接列出五大核心调优要点,为读者提供快速预览: 1. **初始堆内存设置**:合理配置-Xms和-Xmx参数,避免频繁的内存分配与回收。 2. **垃圾收集器选择**:根据应用特性选择合适的GC策略,如G1 GC、ZGC等。 3. **线程优化**:调整线程栈大小及并发线程数,平衡资源利用率与响应速度。 4. **JIT编译器优化**:利用-XX:CompileThreshold等参数优化即时编译性能。 5. **监控与诊断工
|
6月前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
108 1
|
2月前
|
存储 前端开发 Java
JVM必备知识
JVM必备知识
|
2月前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
5月前
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
216 10
|
6月前
|
存储 监控 Java
JVM:Java虚拟机探秘
JVM:Java虚拟机探秘
45 1
|
7月前
|
存储 安全 Java
深入探究Java虚拟机(JVM)的技术细节
深入探究Java虚拟机(JVM)的技术细节
|
存储 算法 安全
JVM探究
请谈谈你对JVM的理解? java8虚拟机和之前的变化更新? - 什么是OOM,什么是栈溢出StackOverFlowError? 怎么分析? - JVM的常用调优参数有哪些? - 内存快照如何抓取,怎么分析Dump文件? - 谈谈JVM中,类加载器你的认识
133 0
|
监控 Java 编译器
JVM技术实战-预习一下编译器的运行模式
JVM技术实战-预习一下编译器的运行模式
143 0
|
前端开发 Java 应用服务中间件
JVM从入门到入土之JVM的类加载机制(下)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
114 0