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. JVM基础入门

    内存模型 我理解的jvm: 个人理解的jvm流程: .java反编译为.class文件 经类加载器到上图的内存模型 方法区:存静态 常量区(String在里面) 本地栈区:调本地服务其它库的方法 计数 ...

  2. MySQL如何搭建主库从库(Docker)

    目录 MySQL主从搭建 一.主从配置原理 二.操作步骤 1.创建主库和从库容器 2.启动主从库容器 3.远程连接并操作主从库 4.测试主从同步 MySQL主从搭建 一.主从配置原理 mysql主从配 ...

  3. Go的结构体

    目录 结构体 一.什么是结构体? 二.结构体的声明 三.创建结构体 1.创建有名结构体 2.结构体初始化 2.1 按位置传参 2.2 按关键字传 3.创建匿名结构体 四.结构体的类型 五.结构体的默认 ...

  4. 基于Hi3559AV100的视频采集(VDEC-VPSS-VO)整体框图设计

    下面给出基于Hi3559AV100的视频采集整体设计,具体设计将在后续给出: 图形采集端整体设计 Hi3559AV100软件程序按结构划分可分为4层,第一层是硬件驱动层,第二层是操作系统层,第三层是媒 ...

  5. Oracle VM VirtualBox下创建CentOS虚拟系统

    下载镜像 创建虚拟电脑 点击新建,输入服务器命名(根据自己喜好),选择好类型和版本(我下载的是64位的CentOS系统,所以选择类型为Linux,版本为其他版本). 修改内存大小 系统建议为512M, ...

  6. HDu1087 Super Jumping! Jumping! Jumping!

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 分析:简单dp:dp[i] = max (dp[i], dp[j] + a[i]) 1 #inc ...

  7. GNS3通过“云”连接到虚拟机实验

    GNS3通过"云"连接到虚拟机实验并使用wireshark工具对数据分析 观看本文之前注意!!!!! 做这次实验,我所遇到的问题,会全部写在文章结尾,如果读者们遇到问题,可查看. ...

  8. Idea 报错 xxxx too long

    问题:写单元测试,debug时,报错如下图 解决方法1: 在项目/.idea/workspace.xml文件中添加一行代码如下 <component name="PropertiesC ...

  9. 【译】Visual Studio 的 Razor 编辑器的改进

    自从我们在一个通用的 Razor 语言服务器上发布了 Visual Studio 的一个新的实验性 Razor 编辑器的第一个预览版以来,已经过去了6个月,现在是时候更新一下我们的进展了.团队一直在努 ...

  10. External Libraries中没有Maven的jar包的原因(已解决)

    **深坑!** ## External Libraries中没有Maven的jar包的原因(已解决) 2021年3月1日 --- 搭建一个新项目 IDEA 从 Git 上拉 拉去Maven项目然后 m ...