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.2JDK1.2兼容智能卡和小型消费类设备,还兼容大型服务器系统。同时Sun发布JSP/Servlet+EJB规范,将Java分成了J2EEJ2SEJ2ME

2000年发布JDK 1.3,默认虚拟机改为Hotspot

2002年发布JDK1.4Classic虚拟机退出舞台。

2004年发布JDK 1.5,支持泛型、注解、自动装箱拆箱、枚举、可变长参数等。

2006年发布JDK 1.6Java开源并建立了OpenJDK

2011年发布JDK 1.7,启用了G1垃圾回收器,支持64位系统的压缩指针以及NIO 2.0

2.4 JDK 1.8+

2014年发布JDK 1.8JDK 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/版本号-2JDK,这里选用的是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-jdkBootJDK的目录

结果:

配置后后进行编译:

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初探的更多相关文章

  1. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  2. JVM学习笔记:JVM的体系结构与JVM的生命周期

    1 JVM在java平台中的位置 1.1 Java平台组成 Java平台主要由Java虚拟机和Java API这两部分组成.参考Oracle官网. 1.2 java平台结构图 JDK1.2开始,迫于J ...

  3. java之jvm学习笔记十三(jvm基本结构) 通俗易懂的JVM 文件,没有之一

    http://blog.csdn.net/yfqnihao/article/details/8289363

  4. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  5. JVM学习笔记:字节码执行引擎

    JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667  

  6. JVM学习笔记(四)------内存调优【转】

    转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...

  7. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  8. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  9. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  10. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

随机推荐

  1. Unity安卓apk打包过程

    前言:对于Unity开发小白来说,Android打包无疑是个头痛的问题,所以我总结了 Unity安卓APK的打包过程 第一步:下载对应版本的Android Platform 第二步:安装JDK并配置J ...

  2. C++算法代码——Tuna

    这道题像个水题啊,可是在我做的这个OJ上就十几人做出来-- 题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=2084 题目描述 渔民抓住 ...

  3. 解决windwos系统80端口被暂用无法发布(NGINX、TOMCAT、IIS)

    原因: 一个操作系统有0-65535个端口,但是一个端口只能被一个应用程序使用.所以80端口只有一个,当开发发布时想用应用NGINX,TOMCAT,IIS发布时,如果有程序占用了,就无法使用了. 解决 ...

  4. CentOS7集群环境Elastic配置

    CentOS7集群环境Elastic配置 (首先去官网下载elasticsearch的source code并解压到/usr/soft目录下) (以下默认root账户) 1.更改配置文件 文件路径:/ ...

  5. Nifi组件脚本开发—ExecuteScript 使用指南(三)

    上一篇:Nifi组件脚本开发-ExecuteScript 使用指南(二) Part 3 - 高级特征 本系列的前两篇文章涵盖了 flow file 的基本操作, 如读写属性和内容, 以及使用" ...

  6. Java中出现Unhandled exception的原因

    说明某个方法在方法声明上已经声明了会抛异常,那么在调用这个方法的时候,就必须做异常处理,处理的方式有2种,要么try-catch这个异常,要么继续往上一层抛出这个异常,这是java语法要求的,必须这么 ...

  7. CentOS7安装ZooKeeper3.4.14

    1:下载安装包 wget https://downloads.apache.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz 点击进入官网下 ...

  8. 1.3 PHP+MYSQL+APACHE配置(序)

    本节对服务器端web服务进行配置.事实上,对于配置这个环境(WAMP)网上还是有很多教程的,大家可以通过网上的教程完成配置,也不必拘泥于本文.甚至网上有免费的服务器端软件可以选择,比如著名的phpst ...

  9. python使用requests模块下载文件并获取进度提示

    一.概述 使用python3写了一个获取某网站文件的小脚本,使用了requests模块的get方法得到内容,然后通过文件读写的方式保存到硬盘同时需要实现下载进度的显示 二.代码实现 安装模块 pip3 ...

  10. 力扣896. 单调数列-C语言实现-简单题

    题目 传送门 文本 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j, ...