详解jvm(1)

作为一名java开发者,jvm一定是必须知道了

java往事我们直接跳过

版本迭代

  • 1991 年,James Gosling 博士发布产品 Oak( 橡树),这是 Java 语言的前身。
  • 1995 年,Oak 语言改名为 Java。
  • 1996 年,JDK(Java开发所使用的工具包)1.0 发布,提供了纯解释执行的 Java 虚拟机实现:Sun Classic VM。
  • 1997 年,JDK1.1 发布,代表技术有:JDBC、JavaBeans、内部类、反射。
  • 1998 年,JDK1.2 发布,Java 技术体系被拆分为 J2SE、J2EE、J2ME 三大体系。
  • 2000 年,JDK1.3 发布,默认的 Java 虚拟机由 Sun Classic VM 改为 HotSopt。
  • 2002 年,JDK1.4 发布,Java 真正走向成熟,代表技术有:正则表达式、NIO等。
  • 2004 年,JDK5.0 发布,对语法易用性做了很大改进,新增了泛型、枚举等,代表技术有:并发包等。
  • 2006 年,JDK6.0 发布,将 J2EE/J2SE/J2ME 的命名方式改为 Java SE 6、Java EE 6、Java ME 6。
  • 2009 年,Sun 公司因为经营不善被 Oracle 公司收购。
  • 2011 年,JDK7 发布。
  • 2013 年,JDK8(LTS) 发布,函数式编程,lamda表达式。
  • 2017年,JDK9
  • 2018年,JDK 10,11(LTS)正式发布
  • 2019年,JDK 12,13
  • 2020年,JDK 14,15
  • 2021年,JDK 16,17(LTS)
    一般企业用的是JDK8,比较稳定

两种jdk

openjdk vs oraclejdk:

  1. Oracle JDK将更多地关注稳定性,它重视更多的企业级用户,而OpenJDK经常发布以支持其他特性,不太稳定。
  2. Oracle JDK支持长期发布的更改(LTS),而Open JDK仅支持计划和完成下一个发行版。
  3. Oracle JDK根据二进制代码许可协议获得许可,而OpenJDK根据GPL v2许可获得许可。
  4. 2019年1月之后发布的Oracle Java SE 8的公开更新将无法用于商业,但是,OpenJDK是完全开源的,可以自由使用。
  5. Oracle JDK的构建过程基于OpenJDK,因此OpenJDK与Oracle JDK之间没有技术差异。
  6. 顶级公司正在使用Oracle JDK,Open JDK不太受欢迎。
  7. Oracle JDK具有良好的GC选项和更好的渲染器,而OpenJDK具有更少的GC选项
  8. 在响应性和JVM性能方面,Oracle JDK提供了更好的性能。
  9. Oracle JDK在运行JDK时不会产生任何问题,而OpenJDK有时会产生一些问题。
  10. Oracle JDK将从其10.0.X版本将收费,用户必须付费或必须依赖OpenJDK才能使用其免费版本。
  11. Oracle JDK完全由Oracle公司开发,而Open JDK项目由IBM,Apple,SAP AG,Redhat等顶级公司加入和合作。

总结:Oracle还是更受企业欢迎,更稳定

知道了jvm我们更要jvm体系

 JVM体系

所谓的一次编码,随处运行 就是jvm掩饰了接口的差异。详细看图

jdk是开发人员的工具包,它包含了java的运行环境和虚拟机,而一次编写到处运行就是基于jvm

知道了体系,我们就看看各种虚拟机

、Sun Classic VM

世界上第一款商用 Java 虚拟机。

1996年随着Java1.0的发布而发布,JDK1.4时完全被淘汰

2、BEA JRockit

专注于服务端应用,号称是世界上最快的JVM
后来被 Oracle收购;Oracle JRockit (原来的 Bea JRockit)

3、IBM公司的 J9VM

全称:IBM Technology for Java Virtual Machine,简称IT4J,内部代号:J9

是 IBM 自己开发的一款 JVM

市场定位于HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM

4、HotSpot VM(现在最常用)

它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。

5、其他

(TaobaoJVM 、Graal VM、Azul VM、Liquid VM、Apache Harmony、)虚拟机

怎么查看直接上命令

java -version

反馈的具体参数

  • hotspot虚拟机
  • Client VM是专门为快速启动和小内存(small footprints)而优化的,像GUI就很适合
  • Server VM是专门为高性能应用而优化的,如服务器应用
  • 版本是基于tag为1.8.0_18

java运行过程

1.源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件)

2.类加载:通过ClassLoader及其子类来完成JVM的类加载

3.类执行:字节码被装入内存,进入JVM虚拟机,被解释器解释执行

关于模型直接上图

由上面的图可以看出,JVM虚拟机中主要是由三部分构成,分别是类加载子系统、运行时数据区、执行引擎。

类加载子系统 

 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验(类的正确性)、转换解析(将常量池内的符号引用转换为直接引用的过程)和初始化(给变量赋值),最终形成可以被虚拟机直接使用的Java类型。

运行时数据区

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。

这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。

执行引擎

执行引擎用于执行JVM字节码指令,主要有两种方式,分别是解释执行编译执行,区别在于,解释执行是在执行时翻译成虚拟机指令执行,而编译执行是在执行之前先进行编译再执行。

解释执行启动快,执行效率低。编译执行,启动慢,执行效率高。

垃圾回收器就是自动管理运行数据区的内存,将无用的内存占用进行清除,释放内存资源。

本地方法库、本地库接口

在jdk的底层中,有一些实现是需要调用本地方法完成的(使用c或c++写的方法),就是通过本地库接口调用完成的。比如:System.currentTimeMillis()方法。

了解jvm后续的一切动作,先从字节码开始。它是一切发生的源头。

郎伟今天就写道这里了,明天会讲字节码的知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郎伟学架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值