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. Using Sqoop to import from db2 to hadoop

    参考 : https://stackoverflow.com/questions/23933481/db2-data-import-into-hadoop         sqoop import - ...

  2. wxWidgets源码分析(1) - App启动过程

    目录 APP启动过程 wxApp入口定义 wxApp实例化准备 wxApp的实例化 wxApp运行 总结 APP启动过程 本文主要介绍wxWidgets应用程序的启动过程,从app.cpp入手. wx ...

  3. Aliyun Oss 上传文件

    目录 Aliyun OSS OSS 简介 OSS 基本概念 OSS 功能概述 OSS 使用 创建存储空间Bucket 创建子目录 Java编码 测试 Aliyun OSS OSS 简介 阿里云对象存储 ...

  4. 后端程序员之路 26、CAP理论

    可能是CAP理论的最好解释 - 西代零零发 - 博客频道 - CSDN.NEThttp://blog.csdn.net/dc_726/article/details/42784237 CAP理论 - ...

  5. STL栈

    stack的基本操作有: 1.入栈:如s.push(x); 2.出栈:如s.pop(). 注意:出栈操作只是删除栈顶的元素,并不返回该元素. 3.访问栈顶:如s.top(); 4.判断栈空:如s.em ...

  6. 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)

    剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...

  7. webstorm2020.3安装破解教程

    免责声明:本教程及相关附件仅限于学术交流,不能用于商业以及违法用途,请于下载后24小时内删除!如产生法律纠纷,一切与本人无关,呼吁各位小伙伴支持下正版软件.本文如有侵权,请联系小编删除之. 该操作是用 ...

  8. 番外----python入门----关于pycharm

    江湖上有句话叫 "武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋". 今天,我们就来介绍一下,python编程界的"屠龙刀",pycharm. 一. ...

  9. 【翻译】内部API的价值

    内部api的设计,主要是为了简化软件的开发,简化系统和操作过程.目前绝大多数用例是这样的. 内部api经常被忽略,因为它们是针对内部开发人员的.这种类型的api通常使用于特定公司及其部门的专用数据.尽 ...

  10. Apache配置 11. 访问控制-user_agent

    (1)介绍 user_agent是指用户浏览器端的信息.比如你是用IE的还是Firefox浏览器的.有些网站会根据这个来调整打开网站的类型,如是手机的就打开wap,显示非手机的就打开PC常规页面. ( ...