JVM学习笔记(一):JVM初探
1 来源
- 来源:《Java虚拟机 JVM故障诊断与性能优化》——葛一鸣
- 章节:第一章
本文是第一章的一些笔记整理。
2 Java
里程碑
2.1 Java
起源
1990年Sun
公司决定开发一门新的程序语言——Oak
,已经具备安全性、网络通信、面向对象、垃圾回收、多线程等特性,由于Oak
已被注册,于是改名为Java
。
2.2 JDK 1.0
1995年Sun
发布了Java
以及HotJava
产品,1996年正式发布JDK 1.0
,包括两部分:
- 运行环境:
JRE
,包括核心API
,用户界面API
,发布技术、JVM
等 - 开发环境:
JDK
,包括编译器javac
等
1997年发布JDK1.1
。
2.3 JDK 1.2-1.7
1998年发布JDK 1.2
,JDK1.2
兼容智能卡和小型消费类设备,还兼容大型服务器系统。同时Sun
发布JSP/Servlet
+EJB
规范,将Java
分成了J2EE
、J2SE
、J2ME
。
2000年发布JDK 1.3
,默认虚拟机改为Hotspot
。
2002年发布JDK1.4
,Classic
虚拟机退出舞台。
2004年发布JDK 1.5
,支持泛型、注解、自动装箱拆箱、枚举、可变长参数等。
2006年发布JDK 1.6
,Java
开源并建立了OpenJDK
。
2011年发布JDK 1.7
,启用了G1
垃圾回收器,支持64位系统的压缩指针以及NIO 2.0
。
2.4 JDK 1.8+
2014年发布JDK 1.8
,JDK 1.8
是一个LTS
版,到目前还支持,引入了全新的Lambda
。
2017年发布JDK 9
。
2018年发布JDK 10
。
2018年发布JDK 11
,又一个LTS
版,引入了字符串增强、Epsilon
垃圾收集器、ZGC
等。
3 JVM
种类简介
Java
发展初期,使用的是Classic
虚拟机,之后在Solaris
短暂地使用过Exact VM
虚拟机,到现在被大规模部署和使用的是Hotspot
虚拟机。
另外,在IBM
内部使用着一款叫J9
的虚拟机,Apache
也曾经推出过Apache Harmony
,基于JDK 5
以及JDK 6
,于2011年停止开发。
4 JVM
简单编译调试实战
下面以OpenJDK15
为例,对OpenJDK 15 JVM
进行源码编译。
(注:由于笔者系统为Manjaro
,这是一个滚更的系统,很多工具链都会更新到最新的状态,比如GCC 10.2
,书籍中的例子是利用JDK8
去编译JDK10
,实际测试发现会报错,configure
成功了但是make
失败,然后就切换到最新的JDK
,就编译成功了。对于不是滚更的系统,可以使用JDK10
去编译JDK11
等,而非采用目前最新的JDK15
)
4.1 获取源码+BootJDK
戳这里下载:
可以使用如下命令检测下载文件的完整性:
echo "bb67cadee687d7b486583d03c9850342afea4593be4f436044d785fba9508fb7 openjdk-15+36_linux-x64_bin.tar.gz" | sha256sum --check
echo "d07bf62b4b20fa6bcd4c8fcd635e5df20b7c090af291675b2bd99f8cea8760a0 openjdk-15+36_src.zip" | sha256sum --check
另外需要准备一个BootJDK
,根据BootJDK
的规则:
建议使用当前版本号
/版本号-1
/版本号-2
的JDK
,这里选用的是OpenJDK 15
。
4.2 安装依赖库
笔者系统Manajro
,需要安装一些基础依赖:
paru -S base-devel
# 或
pacman -S base-devel
# 或
yay -S base-devel
如果依赖库安装不完整在配置阶段以及编译阶段会给出相应提示,再进行对应依赖安装即可。
4.3 编译
解压源码进入目录:
unzip openjdk-15+36_src.zip
tar -zxvf openjdk-15+36_linux-x64_bin.tar.gz
cd openjdk
配置:
bash configure --with-debug-level=slowdebug --with-jvm-variants=server --with-target-bits=64 --with-memory-size=8000 --disable-warnings-as-errors --with-native-debug-symbols=internal --with-boot-jdk=../jdk-15
参数说明:
--with-debug-level=slowdebug
:编译DEBUG
版本的JDK
,选项可以是slowdebug
/fastdebug
/release
/optimized
--with-jvm-variants=server
:构建server
变体的Hotspot
,选项可以是server
/client
/minimal
/core
/zero
/custom
--with-target-bits=64
:编译64位的JDK
,编译32位可以使用--with-target-bits=32
--with-memory-size=8000
:编译的计算机至少需要8G内存,这个可以根据个人需要调整--disable-warnings-as-errors
:忽略警告的信息,注意该参数很重要,不加的话会显示配置成功但make
失败--with-native-debug-symbols=internal
:生成symbol
文件,便于后续调试,选项可以是internal
/none
/external
/zipped
--with-boot-jdk
:BootJDK
的目录
结果:
配置后后进行编译:
make images
这个阶段需要一点时间,而且会把CPU
拉满,好了之后会提示Finished building
:
笔者环境下编译出来的JDK
占了3G:
进入对应目录可以查看版本:
4.4 调试
调试需要gdb
,先安装好gdb
:
paru -S gdb
进入bin
目录(build/linux-x86_64-server-slowdebug/jdk/bin
),输入:
gdb -args ./java -version
在main
函数打断点:
(gdb) b main
再执行run
,可以看到会停在java.base/share/native/launcher/main.c
第98行:
(gdb) run
再次输入n
可进行单步调试:
(gdb) n
这样就算完成了基础的调试操作,为进一步学习JVM
准备好基本的环境。
4.5 JVM
下载
如果编译失败的话,笔者这里提供了自己编译出来的JVM
:
JVM学习笔记(一):JVM初探的更多相关文章
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- JVM学习笔记:JVM的体系结构与JVM的生命周期
1 JVM在java平台中的位置 1.1 Java平台组成 Java平台主要由Java虚拟机和Java API这两部分组成.参考Oracle官网. 1.2 java平台结构图 JDK1.2开始,迫于J ...
- java之jvm学习笔记十三(jvm基本结构) 通俗易懂的JVM 文件,没有之一
http://blog.csdn.net/yfqnihao/article/details/8289363
- JVM学习笔记:虚拟机的类加载机制
JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...
- JVM学习笔记:字节码执行引擎
JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667
- JVM学习笔记(四)------内存调优【转】
转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...
- JVM学习笔记(四)------内存调优
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...
- java jvm学习笔记七(jar包的代码认证和签名)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
随机推荐
- ubuntu ARM换国内源和国内源安装ROS
ubuntu arm换国内源: https://www.cnblogs.com/yongy1030/p/10315569.html 国内源安装ROS: https://blog.csdn.net/ch ...
- SSL/TLS协议详解(下)——TLS握手协议
本文转载自SSL/TLS协议详解(下)--TLS握手协议 导语 在博客系列的第2部分中,对证书颁发机构进行了深入的讨论.在这篇文章中,将会探索整个SSL/TLS握手过程,在此之前,先简述下最后这块内容 ...
- css选择器,过滤筛选
$('.required:not(.final_price)').each(function() { if (!$(this).val()) { error_count ++; if ($(this) ...
- 1079 Total Sales of Supply Chain ——PAT甲级真题
1079 Total Sales of Supply Chain A supply chain is a network of retailers(零售商), distributors(经销商), a ...
- OSS对象储存
简介 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务. 使用流程 名词解释 Endpoint(访问域名) Ac ...
- STL栈
stack的基本操作有: 1.入栈:如s.push(x); 2.出栈:如s.pop(). 注意:出栈操作只是删除栈顶的元素,并不返回该元素. 3.访问栈顶:如s.top(); 4.判断栈空:如s.em ...
- iOS之CoreBluetooth
思路 手机与设备间的通讯方式CoreBluetooth是比较常见且通用的.在iOS开发中需明晰以下几点 蓝牙4.0最多可联机7个设备,iPhone6以上都是蓝牙4.0 两台iPhone并不直接通过蓝牙 ...
- 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针
剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...
- HDOJ-1711(KMP算法)
Number Sequence HDOJ-1711 1.这里使用的算法是KMP算法,pi数组就是前缀数组. 2.代码中使用到了一个技巧就是用c数组看成是复合字符串,里面加一个特殊整数位-1000006 ...
- 【免费开源】基于Vue和Quasar的crudapi前端SPA项目实战—环境搭建 (一)
背景介绍和环境搭建 背景 crudapi增删改查接口系统的后台Java API服务已经全部可用,需要一套后台管理UI,主要用户为开发人员或者对计算机有一定了解的工作人员,通过UI配置元数据和处理业务数 ...