深入理解java虚拟机系列每礼拜天更新一次,大家感兴趣的可以关注一下呦~
第一章的内容感觉还是挺多的,不过翻一下感觉都是讲一些java的特点,历史,然后一些奇奇怪怪的公司什么的。。。废话不多说,开啃!!!(生词出现我都会在旁边标注英文全称和中文直译,我感觉这样比较好记~)
Java特点
- 结构严谨,面向对象;
- 摆脱硬件束缚,“一次编写,到处运行”;
- 提供一个相对安全的内存管理和访问机制,避免大部分内存泄漏和指针越界(想必是大名鼎鼎的垃圾回收器吧);
- 热点代码检测和运行时编译及优化,运行着运行着性能就增加了。。。(听起来66的);
- 拥有完善的应用接口(在下感觉这就是java方便的地方);
小结:都得记,已经很精简了。
Java技术体系
Sun定义的Java技术体系包括:
- java程序设计语言(java语法之类的)
- 各平台的java虚拟机(运行java程序的平台)
- class文件格式(面向对象的载体)
- java api(不计其数的java自带可调用的库)
- 第三方java类库(各种封装好的库)
JDK(Java Development Dit)(java 开发 工具包):1,2,4。也就是支持java开发的最小环境。
JRE(Java Runtime Environment)(java 运行时 环境):javase(Java Standard Edition)(java 标准版本)的api+虚拟机。
小结:这里想一下自己编写代码需要什么,还是比较容易的。最后两点JDK和JRE的组成就死记硬背一下~。
此处附送一张 java技术体系模块图
java根据业务领域划分:
- Java Card(字面意思感觉像卡片机):玩具版。跑小程序(Applets)的平台,如智能卡(银行卡吗??黑人问号脸)。
- Java ME(Micro Edition)(微型版)以前称为J2ME:阉割版。移动级平台,如手机,PDA(Personal Digital Assistant)(掌上电脑)等。这个版本精简了标配的Java Api,但是加入了针对移动版的支持。
- Java SE以前称为J2SE:标配版。支持桌面级应用,如windows下的软件。
- Java EE(Enterprise Edition)(企业版)以前称为J2EE:至尊版。支持多层架构的企业应用(ERP(Enterprise Resource Planning)(企业资源管理计划),CRM(Customer Relationship Management)(客户关系管理))的java平台。
总结: 玩具版(青春版)[Card],阉割版[ME],标配版[SE],至尊版[EE]。
Java发展史
第一感觉是不看滚!!!但是本着认真写博客的态度,还是决定看一遍然后我尽量写的精简一点。大家就当看小说吧。。。虽然挺枯燥的,但是忍一忍吧。加黑的年份是比较重要的。
- 1991.4——James Gosling搞出来一个Oak(橡树)用于在冰箱,收音机上面开发程序,但是成效一般。
- 1995.5.23——Oak->Java,并且发布Java 1.0。第一次提出了”Write Once,Run Anywhere”即”一次编写,到处运行”(大写的卧槽!原来这句话在历史上有原话的!!!我还以为是大家吹着吹着流行起来的呢。。)
- 1996.1.23——JDK1.0发布(上面是JAVA1.0),即第一个运行环境。
- 1996.5——很多很多公司(包括网页上)嵌入JAVA技术,举行第一届JavaOne大会(Java玩家的盛会)。
- 1997.2.19——发布JDK1.1同时JAVA语法出现内部类和反射(这么快就出现了。。。表示我还没有很熟练。。。)。直到1999.4.8,JDK1.1发布了很多小版本(1.1.0~1.1.8),比较有趣的一点从JDK1.1.4之后每个版本都有自己的名字。1.1.4~1.1.8分别为:Sparker(宝石),Pumpkin(南瓜).Abigail(阿比盖尔,女子名(饥荒里面的小姐姐嘿嘿)),Brutus(布鲁图,古罗马政治家和将军),Chelsea(切尔西,城市名)。
- 1998.12.4——JDK1.2-Playground(竞技场)。从这里开始JAVA分为J2SE,J2EE,J2ME。1999.3,发布了JDK1.2.1,1999.7发布了JDK1.2.2。
- 1999.4.27——HotSpot虚拟机发布。(似乎这个虚拟机很厉害,大家记一下(敲黑板。。))
- 2000.5.8——JDK1.3-Kestrel(美洲红隼)发布。一些类库有了改进(数学运算和新的Time Api等)。2001.5.17,发布了JDK1.3.1-Ladybird(瓢虫)。(终于来到了21世纪啦!!!,从JDK1.3开始差不多每两年发布一个JDK的大版本(以动物命名),期间的小版本就用昆虫命名)。
- 2002.2.13——JDK1.4发布-Merlin(灰背隼),JAVA慢慢成熟啦。新特性包括:正则表达式,NIO,日志类,XML解析器等等。到现在仍然有很多应用使用JDK1.4。2002.9.16发布JDK1.4.1-Grasshopper(蚱蜢),2003.6.26发布JDK1.4.2-Mantis(螳螂)。
- 2004.9.30——JDK1.5-Tiger(老虎)发布。引入了自动装箱,泛型,动态注解,枚举,可变长参数,遍历循环(foreach)等语法特性。另外JDK1.5是支持Windows9X的最后一个版本。(从JDK1.5之后改为JDK5,JDK6的命名方法)。
- 2006.12.11——JDK1.6(JDK 6)-Mustang(野马)发布。J2EE->Java EE,J2SE->Java SE,J2ME->Java SE。在2006年的JavaOne大会上,宣布Java开源。
- 2009.2.19——JDK1.7(JDK 8)-Dolphin(海豚)发布。
- 2009.4.20——Sun GG。被Oracle收购。
小结:大家看看吧,码字不易。累死我了!!!jdk大版本的代号从天上的动物到地上再到海里。美洲红隼->灰背隼->老虎->野马->海豚->JDK 8?。
Java 虚拟机发展史
what fuck!!!我就挑几个相比之下666的虚拟机简单说一下吧。。
- Sun Classic/Exact VM:世界上第一款商用Java虚拟机,Sun研发。 特点:慢。。。(Java语言很慢这个形象就是从这里开始树立起来的)。直到Java JDK1.4的时候退出商用虚拟机舞台。
- Sun HotSpot VM:目前使用范围最广的虚拟机,是Sun从一家名为Longview Technologies公司收购来的。主要特点:热点探测技术(前文的Java特点中有提到)。
- BEA JRockit /IBM J9 VM:当时号称”世界上最快的Java虚拟机”(据说快的男人不太有人喜欢~)。
- Google Android Dalvik VM:安卓虚拟机。是Android平台的核心组成部分之一。
小结:第一个虚拟机,目前最普及的虚拟机,当时号称最快的虚拟机,android虚拟机。
展望Java技术的未来
黑人问号脸?关我一根毛的事?
- 模块化:说起来也就是解除功能模块和功能模块之间的耦合,降低系统维护消耗。(书上也没仔细说,大家看着标题脑补一下也就知道是干嘛的)
- 混合语言:。。。对系统来说是好事(因为不同语言有不同语言的特点 也就是擅长的地方),但是对于我们程序员来说是件煎熬的事情。那以后公司招人不就要求什么都会写嘛,现在的NDK似乎就是这样子。哇的一声哭了出来!!!
当当当,附图一张:
- 多核并行:这点我认同的。敲黑板!!!不过我还没学,下次学习的时候再写一篇连载博客,有什么好书或者好资源大家推荐一下~
- 丰富语法:那不就是你们更新JDK版本的事情吗。。。
- 64位虚拟机:现在64位虚拟机速度没有32位快,主要是Java EE对64位虚拟机的要求比较急迫。(我相信在不久的将来一定会有成熟的64位虚拟机的!嗯嗯,我相信就好了。。。)
实战:自己编译JDK
这个本来我写了一大段文字的。。。做到后来做不出了。很怪!很皮!可能是因为我的jdk版本和作者的不一样,参数应该设置的不一样吧。但我linux这学期才开始学,毛都不懂~各位看官不好意思哈,小弟搞不出来啦。。
这里放一张源码结构图大家感兴趣的看一看:
├─agent Serviceability Agent的客户端实现
├─make 用来build出HotSpot的各种配置文件
├─src HotSpot VM的源代码
│ ├─cpu CPU相关代码(汇编器、模板解释器、ad文件、部分runtime函数在这里实现)
│ ├─os 操作系相关代码
│ ├─os_cpu 操作系统+CPU的组合相关的代码
│ └─share 平台无关的共通代码
│ ├─tools 工具
│ │ ├─hsdis 反汇编插件
│ │ ├─IdealGraphVisualizer 将server编译器的中间代码可视化的工具
│ │ ├─launcher 启动程序“Java”
│ │ ├─LogCompilation 将-XX:+LogCompilation输出的日志(hotspot.log)整理成更容易阅读的格式的工具
│ │ └─ProjectCreator 生成Visual Studio的project文件的工具
│ └─vm HotSpot VM的核心代码
│ ├─adlc 平台描述文件(上面的cpu或os_cpu里的*.ad文件)的编译器
│ ├─asm 汇编器接口
│ ├─c1 client编译器(又称“C1”)
│ ├─ci 动态编译器的公共服务/从动态编译器到VM的接口
│ ├─classfile 类文件的处理(包括类加载和系统符号表等)
│ ├─code 动态生成的代码的管理
│ ├─compiler 从VM调用动态编译器的接口
│ ├─gc_implementation GC的实现
│ │ ├─concurrentMarkSweep Concurrent Mark Sweep GC的实现
│ │ ├─g1 Garbage-First GC的实现(不使用老的分代式GC框架)
│ │ ├─parallelScavenge ParallelScavenge GC的实现(server VM默认,不使用老的分代式GC框架)
│ │ ├─parNew ParNew GC的实现
│ │ └─shared GC的共通实现
│ ├─gc_interface GC的接口
│ ├─interpreter 解释器,包括“模板解释器”(官方版在用)和“C++解释器”(官方版不在用)
│ ├─libadt 一些抽象数据结构
│ ├─memory 内存管理相关(老的分代式GC框架也在这里)
│ ├─oops HotSpot VM的对象系统的实现
│ ├─opto server编译器(又称“C2”或“Opto”)
│ ├─prims HotSpot VM的对外接口,包括部分标准库的native部分和JVMTI实现
│ ├─runtime 运行时支持库(包括线程管理、编译器调度、锁、反射等)
│ ├─services 主要是用来支持JMX之类的管理功能的接口
│ ├─shark 基于LLVM的JIT编译器(官方版里没有使用)
│ └─utilities 一些基本的工具类
└─test 单元测试
本章重点
- java特点(没准面试会问):结构严谨,库多,hotspot热点检测技术,自动垃圾回收使得内存相对安全。
- java组成:语言(语法),虚拟机,class结构,api,其他公司写的库
- java领域划分:Java Card 智能卡应用,Java ME(J2ME)移动应用,Java SE(J2SE)桌面应用,Java EE(J2EE)企业应用
- java发展史:Oak->Java,有个JavaOne大会,各个版本更新,1.3~1.7:美洲红隼->灰背隼->老虎->野马->海豚。
- java虚拟机:第一个:Sun Classic VM;用的最多的:HotSpot