系列文章目录
第一章: 走近Java
第二章: Java内存区域与内存溢出异常
世界上并没有完美的程序,但我们不应因此而沮丧,因为写程序本来就是一个不断追求完美的过程,人生也是
一、概述
1、Java是什么?
它不仅仅是一门编程语言,还是由一个由一系列计算机软件和规范组成的技术体系,这个体系提供了完整的用于软件开发和平台部署的支持环境,并广泛用于嵌入式系统、移动终端、企业服务、大型机等多种场合(大部分人接触最多的应该是企业服务)
2、Java有哪些优点?
- 摆脱硬件平台的束缚,实现“一次编写,到处运行”
- 提供相对安全的内存管理和访问机制,避免绝大部分内存泄漏和指针越界问题
- 实现热点代码检测和运行时编译优化,使Java应用随着运行时间增长而获得更高性能
- 一套完善的应用程序接口及无数来自商业机构和开源社区的第三方类库支持
3、Java技术体系
从广义讲,Kotlin、Clojure、JRuby、Groovy等运行于Java虚拟机上的编程语言及相关程序都属于其中的一员;
从传统意义上分为以下几个部分
- Java程序设计语言
- 各种硬件平台上的Java虚拟机实现
- Class文件格式
- Java类库API
如图所示
JVM指Java虚拟机
JRE指用于支持Java程序运行的标准环境,可以把Java类库API中的JavaSE API子集和Java虚拟机这两部分统称为JRE
JDK指用于支持Java程序开发的最小环境,可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK
4、Java发展史(星星之火燎原)
1991.04 James Gosling领导设计Oak
1995.05.23 Oak改名Java,Sun World大会正式发布Java1.0Alpha/Beta版本
1997.02.19 Jdk1.1发布,技术代表(JAR文件格式、JDBC、JavaBean、RMI)、语言支持(内部类、反射)
1998.12.04 Jdk1.2发布,Sun公司将Java技术体系拆为三个方向:J2SE面向桌面开发、J2EE面向企业开发、J2ME面向手机等移动端开发,技术代表(EJB、JavaPlug-in、JavaIDL、Swing),第一次内置JIT即时编译器,语言API支持(strictfp关键字、一系列Collection集合类)
2000.05.08 Jdk1.3发布,主要改进体现在Java类库上
2002.02.13 Jdk1.4发布,真正走向成熟的一个版本。技术新特性(正则表达式、异常链、NIO、日志类、XML解析器、XSLT转换器等)
2004.09.30 Jdk5发布,语法特性(自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环等),虚拟机和API层面(改进内存模型、提供concurrent并发包等)
2006.12.11 Jdk6发布,提供初步的动态预言支持、提供编译器注解处理器和微型HTTP服务器API等,虚拟机改进层面(锁与同步、垃圾收集器、类加载器等)
故事......
2011.07.28 Jdk7发布,提供G1收集器、加强对非Java语言的调用支持、可并行的类加载架构等
2014.03.18 Jdk8发布,功能特性(对Lamba表达式的支持、内置Nashorn JavaScript引擎的支持、新的时间/日期API、彻底移除HotSpot的永久代等)
2017.09.21 Jdk9发布,Jigsaw模块化功能支持、增强若干工具(JS Shell、JLink、JHSDB等)、整顿Hotspot日志系统、支持HTTP2客户端API等
2018.03.20 Jdk10发布,主要研发目标为内部重构
2018.09.25 Jdk11发布,ZGC垃圾收集、类型推断加入Lambda语法等,调整JDK授权许可证,同时发行Oracle OpenJDK(免费商用)和OracleJDK(付费商用)
2019.03.19 Jdk12发布,主要有Switch表达式、Java微测试套件等,加入首个非Oracle开发的垃圾收集器-Shenandoah
2019.09.17 Jdk13发布
2020.03.17 Jdk14发布
2020.09 Jdk15发布
2021.03 Jdk16发布
2021.09 Jdk17发布(待定)
https://zh.wikipedia.org/wiki/Java版本历史
二、Java虚拟机家族
1、虚拟机始祖-Sun Classic/Exact VM
Classic是世界上第一款商用虚拟机,随Jdk1.0发布,使用纯解释器方式执行Java代码或使用外挂即时编译
Exact VM是Jdk1.2时发布在Solaris平台的一款虚拟机,使用准确式内存管理(虚拟机可以知道内存中某个位置的数据具体是什么类型)
2、武林盟主-Hotspot VM
准确式内存管理、热点代码探测技术(通过执行计数器找到最有编译价值的代码通知即时编译器编译)
3、小家碧玉-Mobile/Embedded VM
移动/嵌入式市场产品
4、天下第二-BEA JRockit/IBM J9 VM
JRockit VM是BEA在2002年收购所得,专注于服务端应用,不含解释器实现,全部代码依赖即时编译器编译后执行(BEA被Oracle收购,不再继续发展)
IBM J9 VM定位广泛,设计上全面考虑服务端、桌面应用、嵌入式等(活跃)
5、软硬合璧-BEA Liquid VM/Azul VM
BEA Liquid是BEA开发直接运行在自家Hypervisor系统上的JRockit虚拟机虚拟化版本,由虚拟机越过通用操作系统直接控制硬件(项目停止)
Azul VM是Azul Systems公司基于Hotspot改进,运行于自家专有硬件Vega系统上的虚拟机(项目放弃)
6、挑战者-Apache Harmony/Google Andriod Dalvik VM
Apache Harmony是Apache旗下兼容于JDK5和JDK6的Java程序运行平台,包含自己的虚拟机和Java类库API(失败)
Dalvik曾经是Andriod平台核心组成部分之一,不能直接执行Java的Class文件,使用寄存器架构而不是Java虚拟机常见的栈架构(被ART替代)
7、没有成功但并非失败-Microsoft JVM
微软为在Internet Explorer3浏览器支持Java Applets应用而开发自己的虚拟机,是当时Window系统下性能最好的Java虚拟机(Sun起诉微软,产品夭折)
8、展望未来可期…不仅是Java,吾辈亦是
三、实战:手动编译JDK8
## 系统环境
$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
## bootstrap JDK版本
$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
1、获取OpenJDK8源码
wget http://download.java.net/openjdk/jdk8u40/ri/openjdk-8u40-src-b25-10_feb_2015.zip
2、安装依赖,配置编译环境
列举一些需要的依赖
- 机器内存最少1GB 磁盘空间最少6GB
- Development Tools(也就是gcc make等一些工具,gcc版本要求3.7以上 freetype-devel 要求2.3以上)
- Java Development 即bootstrap jdk,,因为OpenJdk源码中有些功能是用java写的,所以编译中间需要用到java环境,就称为bootstrap jdk,要编译大版本为N的JDK,bootstrap jdk至少为N-1版本已经编译好的JDK,编译JDK8必须使用JDK7及以后的版本(这里笔者使用的JDK8)
- X Software Development
- cups devel: Cups Development Package
- alsa devel: Alsa Development Package
- Xi devel: libXi.so Development Package
安装依赖环境,推荐使用yum安装
yum -y install libX11-devel freetype-devel
yum -y groupinstall 'Development Tools'
yum -y install alsa*
yum -y install cups-devel ccache
yum -y install libXtst-devel libXt-devel libXrender-devel
配置编译环境
下载bootstrap jdk(JDK8)
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz
解压
tar -zxvf jdk-8u131-linux-x64.tar.gz
编辑/etc/profile,配置环境变量
export JAVA_HOME=/usr/local/src/jdk/jdk1.8.0_131
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
刷新配置文件
source /etc/profile
校验
$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
3、编译
解压下载的OpenJDK8源码压缩包
unzip -o -d /home/faker/ openjdk-8u40-src-b25-10_feb_2015.zip
cd到源码目录执行 .configure命令(这里笔者加了参数开启debug模式)
[root@localhostopenjdk]#./configure --with-debug-level=fastdebug
# 根据检测的信息,如果出现错误,按提示安装需要的依赖即可
#一切正常,会打印出如下信息,列举了当前的配置信息
A new configuration has been successfully created in
/software/java/my-openjdk/openjdk/build/linux-x86_64-normal-server-fastdebug
using configure arguments '--with-debug-level=fastdebug'.
Configuration summary:
* Debug level: fastdebug
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
Tools summary:
* Boot JDK: java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b15) Java HotSpot(TM) 64-Bit Server VM
(build 24.80-b11, mixed mode) (at /software/java/1.8.0_181)
* C Compiler: gcc (GCC) 4.4.7 20120313 (Red Hat-18) version 4.4.7-18) (at /usr/bin/gcc)
* C++ Compiler: g++ (GCC) 4.4.7 20120313 (Red Hat-18) version 4.4.7-18) (at /usr/bin/g++)
Build performance summary:
* Cores to use: 2
* Memory limit: 15951 MB
* ccache status: installed and in use
执行编译
[root@localhost openjdk]#make
笔者机器大约等待了30分钟,编译成功且在build目录生成linux-x86_64-normal-server-fastdebug目录
## Finished jdk (build time 00:06:14)
----- Build times -------
Start 2021-04-18 19:56:41
End 2021-04-18 20:26:46
00:00:58 corba
00:20:36 hotspot
00:00:26 jaxp
00:00:38 jaxws
00:06:14 jdk
00:01:13 langtools
00:30:05 TOTAL
-------------------------
Finished building OpenJDK for target 'default'
[root@localhost build]# ll
总用量 4
drwxr-xr-x. 9 root root 4096 4月 18 20:20 linux-x86_64-normal-server-fastdebug
简单测试下
[root@localhost build]# cd linux-x86_64-normal-server-fastdebug/jdk/bin/
[root@localhost bin]# ./java -version
openjdk version "1.8.0-internal-fastdebug"
OpenJDK Runtime Environment (build 1.8.0-internal-fastdebug-root_2021_04_18_19_55-b00)
OpenJDK 64-Bit Server VM (build 25.40-b25-fastdebug, mixed mode)
关于configure的一些参数说明:
--enable-debug 开启dubug模式 --with-debug-level=level debug模式的等级 --with-alsa=path 添加依赖,指定alsa的位置(yum安装的alsa不需要用这个指定) --with-boot-jdk=path boot-jdk的位置(我们已配置到环境变量也无需指定) --with-boot-jdk-jvmargs=“args” boot-jdk的jvm参数 --with-cups=path cups的位置 --with-freetype=path freetype的位置 --with-target-bits=arg 如果编译32位 可指定为32 --with-memory-size=size 指定GNU编译时 所需的RAM大小
更多请参考 : OpenJDK构建自述文件
结束。。。。。。。。。。。.。。。。。。。。