导航:首页 > 源码编译 > hotspot源码分析视频

hotspot源码分析视频

发布时间:2023-09-24 07:54:26

‘壹’ HotSpot实战的作品目录

第1章初识HotSpot
1.1JDK概述
1.1.1JCP与JSR
1.1.2JDK的发展历程
1.1.3java 7的语法变化
1.2动手编译虚拟机
1.2.1源代码下载
1.2.2HotSpot源代码结构
1.2.3搭建编译环境
1.2.4编译目标
1.2.5编译过程
1.2.6编译常见问题
1.3实战:在HotSpot内调试HelloWorld
1.3.1认识GDB
1.3.2准备调试脚本
1.4小结
第2章启动
2.1HotSpot内核
2.1.1如何阅读源代码
2.1.2HotSpot内核框架
2.1.3Prims
2.1.4Services
2.1.5Runtime
2.2启动
2.2.1Launcher
2.2.2虚拟机生命周期
2.2.3入口:main函数
2.2.4主线程
2.2.5InitializeJVM函数
2.2.6JNI_CreateJavaVM函数
2.2.7调用Java主方法
2.2.8JVM退出路径
2.3系统初始化
2.3.1配置OS模块
2.3.2配置系统属性
2.3.3加载系统库
2.3.4启动线程
2.3.5vm_init_globals函数:初始化全局数据结构
2.3.6init_globals函数:初始化全局模块
2.4小结
第3章类与对象
3.1对象表示机制
3.1.1OOP-Klass二分模型
3.1.2Oops模块
3.1.3OOP框架与对象访问机制
3.1.4Klass与instanceKlass
3.1.5实战:用HSDB调试HotSpot
3.2类的状态转换
3.2.1入口:Class文件
3.2.2类的状态
3.2.3加载
3.2.4链接
3.2.5初始化
3.2.6实战:类的“族谱”
3.2.7实战:系统字典
3.3创建对象
3.3.1实例对象的创建流程
3.3.2实战:探测JVM内部对象
3.4小结
第4章运行时数据区
4.1堆
4.1.1Java的自动内存管理
4.1.2堆的管理
4.2线程私有区域
4.2.1PC
4.2.2JVM栈
4.3方法区
4.3.1纽带作用
4.3.2常量池
4.3.3常量池缓存:ConstantPoolCache
4.3.4方法的表示:methodOop
4.3.5方法的解析:将符号引用转换成直接引用
4.3.6代码放在哪里:ConstMethodOop
4.3.7实战:探测运行时常量池
4.4性能监控数据区:Perf Data
4.4.1描述这段空间:PerfMemory
4.4.2 查看
4.4.3 生产
4.5 转储
4.5.1 用VisualVM进行转储分析
4.5.2 JVM Crash
4.6 小结
第5章 垃圾收集
5.1 堆与GC
5.1.1 垃圾收集
5.1.2 分代收集
5.1.3 快速分配
5.1.4 栈上分配和逸出分析
5.1.5 GC公共模块
5.2 垃圾收集器
5.2.1 设计演进
5.2.2 CMS收集器
5.2.3 G1收集器
5.3 实战:性能分析方法
5.3.1 获取GC日志
5.3.2 GC监控信息
5.3.3 内存分析工具
5.3.4 选择合适的收集器与GC性能评估
5.3.5 不要忽略JVM Crash日志
5.4 小结
第6章 栈
6.1 硬件背景:了解真实机器
6.1.1 程序是如何运行的
6.1.2 x86与栈帧
6.1.3 ARM对Java硬件级加速:Jazelle技术
6.2 Java栈
6.2.1 寄存器式指令集与栈式指令集
6.2.2 HotSpot中的栈
6.2.3 栈帧
6.2.4 充分利用寄存器资源
6.2.5 虚拟机如何调用Java函数
6.2.6 优化:栈顶缓存
6.2.7 实战:操作数栈
6.3 小结
第7章 解释器和即时编译器
7.1 概述
7.2 解释器如何工作
7.2.1 Interpreter模块
7.2.2 Code模块
7.2.3 字节码表
7.2.4 Code Cache
7.2.5 InterpreterCodelet与Stubs队列
7.2.6 Code生成器
7.2.7 模板表与转发表
7.2.8 实战:InterpreterCodelet
7.3 即时编译器
7.3.1 概述
7.3.2 编译器模块
7.3.3 编译器的基本结构
7.3.4 实战:编译原理实践,了解编译中间环节
7.4 小结
第8章 指令集
8.1 再说栈式指令集
8.2 数据传送
8.2.1 局部变量、常量池和操作数栈之间的数据传送
8.2.2 数据传送指令
8.2.4 实战:数组的越界检查
8.3 类型转换
8.4 对象的创建和操作
8.5 程序流程控制
8.5.1 控制转移指令
8.5.2 条件转移
8.5.3 无条件转移
8.5.4 复合条件转移
8.5.5 实战:switch语句如何使用String
8.6 运算
8.6.1 加法:iadd
8.6.2 取负:ineg
8.7 函数的调用和返回
8.7.1 Java函数分发机制:VTABLE与ITABLE
8.7.2 invoke系列指令
8.7.3 动态分发:覆盖
8.7.4 静态分发:重载
8.8 异常
8.8.1 异常表
8.8.2 创建异常
8.8.3 try-catch
8.8.4 finally
8.9 小结
第9章 虚拟机监控工具
9.1 Attach机制
9.1.1 AttachProvider与VirtualMachine
9.1.2 命令的下发:execute()
9.1.3 命令的执行:Attach Listener守护线程
9.2 查看JVM进程
9.2.1 用jps查看Java进程
9.2.2 实战:定制jps,允许查看库路径
9.3 查看和配置JVM
9.3.1 用jinfo查看JVM参数配置
9.3.2 实战:扩展flags选项,允许查看命令行参数
9.4 堆内存转储工具
9.4.1 Heap Dump
9.4.2 原理
9.5 堆转储分析
9.5.1 Heap Dump分析工具:jhat
9.5.2 实战:MAT分析过程
9.6 线程转储分析
9.6.1 jstack
9.6.2 实战:如何分析资源等待
9.7 小结

‘贰’ JVM-安全点

Total time for which application threads were stop 超级长时间,这行日志代表什么,以及为什么时间会这么长

当GC发生时,每个线程只有进入了SafePoint才算是真正挂起,也就是真正的停顿,这个日志的含义是整个GC过程中STW的时间,配置了 -XX:+PrintGCApplicationStoppedTime 这个参数才会打印这个信息。

重点: 第一个 2.81 seconds 是JVM启动后的秒数,第二个 2.6 seconds 是 JVM发起STW的开始到结束的时间。特别地,如果是GC引发的STW,这条内容会紧挨着出现在GC log的下面。

有关安全点的详细说明,请移步:
JVM源码分析之安全点safepoint
[Java JVM] Hotspot GC研究- GC安全点 (Safepoint&Stop The World)

等待所有用户线程进入安全点后并阻塞,做一些全局性操作的行为。

配置 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 参数,虚拟机会打印如下日志文件:

RevokeBias、BulkRevokeBias、偏向锁取消情况。
Deoptimize、
G1IncCollectionPause GC GC 执行情况。

分析 -XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1 产生的日志信息基本上STW的原因都是RevokeBias或者BulkRevokeBias。这个是撤销偏向锁操作,虽然每次暂停的 时间很短,但是特别频繁出现也会很耗时。

一些高并发的系统中,禁掉JVM偏向锁优化,可以提升系统的吞吐量 。禁用偏向锁的参数为: -XX:-UseBiasedLocking

R大分析类似情况
调优建议
各种JVM参数说明
stw分析
R大的博客
安全点 stw说明
偏向锁

‘叁’ jvm源码精析 怎么都是cpp

Attach是什么
在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地方,想知道卡在哪里,首先想到的是进行线程mp,而常用的命令是jstack ,我们就可以看到如下线程栈了
2014-06-18 12:56:14
Full thread mp Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):

"Attach Listener" daemon prio=5 tid=0x00007fb0c6800800 nid=0x440b waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Service Thread" daemon prio=5 tid=0x00007fb0c584d800 nid=0x5303 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=5 tid=0x00007fb0c482e000 nid=0x5103 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=5 tid=0x00007fb0c482c800 nid=0x4f03 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=5 tid=0x00007fb0c4815800 nid=0x4d03 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=5 tid=0x00007fb0c4813800 nid=0x3903 in Object.wait() [0x00000001187d2000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007aaa85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x00000007aaa85568> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

"Reference Handler" daemon prio=5 tid=0x00007fb0c4800000 nid=0x3703 in Object.wait() [0x00000001186cf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007aaa850f0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x00000007aaa850f0> (a java.lang.ref.Reference$Lock)

‘肆’ Hotspot的源码应该怎样阅读

如果你下的只是HotSpot VM的代码的话那好办,Oracle JDK 6/Oracle JDK 7/OpenJDK 6/OpenJDK 7里的HotSpot VM基本上目录结构都是一样的。

├—agent Serviceability Agent的客户端实现
├—make 用来build出HotSpot的各种配置文件
├—src HotSpot VM的源代码
│ ├—cpu CPU相关代码(汇编器、模板解释器、ad文件、部分runtime函数在这里实现)
│ ├—os 操作系相关代码
│ ├—os_cpu 操作系统+CPU的组合相关的代码
│ └—share 平台无关的共通代码
│ ├—tools 工具
│ │ ├—hsdis 反汇编插件
│ │ ├—IdealGraphVisualizer 将server编译器的中间代码可视化的工具
│ │ ├—launcher 启动程序“java”
│ │ ├—LogCompilation 将-XX:+LogCompilation输出的日志(hotspot.log)整理成更容易阅读的格式的工具
│ │ └—ProjectCreator 生成Visual Studio的project文件的工具
│ └—vm HotSpot VM的核心代码
│ ├—adlc 平台描述文件(上面的cpu或os_cpu里的*.ad文件)的编译器
│ ├—asm 汇编器接口
│ ├—c1 client编译器(又称“C1”)
│ ├—ci 动态编译器的公共服务/从动态编译器到VM的接口
│ ├—classfile 类文件的处理(包括类加载和系统符号表等)
│ ├—code 动态生成的代码的管理
│ ├—compiler 从VM调用动态编译器的接口
│ ├—gc_implementation GC的实现
│ │ ├—concurrentMarkSweep Concurrent Mark Sweep GC的实现
│ │ ├—g1 Garbage-First GC的实现(不使用老的分代式GC框架)
│ │ ├—parallelScavenge ParallelScavenge GC的实现(server VM默认,不使用老的分代式GC框架)
│ │ ├—parNew ParNew GC的实现
│ │ └—shared GC的共通实现
│ ├—gc_interface GC的接口
│ ├—interpreter 解释器,包括“模板解释器”(官方版在用)和“C++解释器”(官方版不在用)
│ ├—libadt 一些抽象数据结构
│ ├—memory 内存管理相关(老的分代式GC框架也在这里)
│ ├—oops HotSpot VM的对象系统的实现
│ ├—opto server编译器(又称“C2”或“Opto”)
│ ├—prims HotSpot VM的对外接口,包括部分标准库的native部分和JVMTI实现
│ ├—runtime 运行时支持库(包括线程管理、编译器调度、锁、反射等)
│ ├—services 主要是用来支持JMX之类的管理功能的接口
│ ├—shark 基于LLVM的JIT编译器(官方版里没有使用)
│ └—utilities 一些基本的工具类
└—test 单元测试

你看到的目录结构应该是类似这样的

阅读全文

与hotspot源码分析视频相关的资料

热点内容
bestfit算法 浏览:14
通达信能自己编程吗 浏览:766
powlinux 浏览:919
什么app手机铃音免费 浏览:397
玩不坏的解压器怎么折 浏览:433
文件解压验证失败 浏览:451
vivo算法sp薪资 浏览:77
拨号服务是什么app 浏览:427
华为有自己的编译器 浏览:209
程序员退出自媒体 浏览:312
电脑加密图片怎么显示没有预览 浏览:575
印刷加密稳定币 浏览:523
这次不一样pdf 浏览:662
linux大于1g的文件 浏览:869
程序员蒙圈图片 浏览:152
it审计师需要会编程么 浏览:74
linux手动分区 浏览:685
鱼竿在哪个app买好 浏览:283
凯恩帝g90车圆锥编程 浏览:39
javacircle 浏览:565