0001_Java笔记 Java平台的分类;如何理解Java平台; JDK、JRE、JVM之间的区别和联系;编译器、解释器;server、client模式的区别;JVM 启动参数;AOT编译模式

学习目标:

程序。
软件。
Java平台的分类
如何理解Java平台?
JDK、JRE、JVM之间的区别和联系。
编译器、解释器。
Java是解释执行还是编译执行?
Java语言的主要类库。
JVM JDK中server、client模式的区别。
JVM 启动参数 -Xint -Xcomp
JDK9 AOT编译模式

学习结论:

程序

程序是为了让计算机执行某些操作或解决某个问题而编写的一列有序的指令集合。


软件

软件的目的是提高人们的工作效率,简化工作流程。
        其实我们在工作常常事与愿违,往往是提高了逻辑复杂度,却忘记了提升工作效率,简化工作流程的初衷。


Java平台的分类:

1、Java SE 标准版
2、Java EE 企业版 (目前大多数Java程序开发者使用的版本)
3、Java ME 嵌入式开发


如何理解Java平台

Java 是一种面向对象的语言,最显著的特性有两个方面
1、书写一次,到处运行(Write once,run anywher),体现了它的跨平台能力。
2、垃圾回收机制(GC, Garbage Collection)通过GC回收分配的内存,开发人员不需要操心内存的分配和回收。


JDK、JRE、JVM之间的区别和联系(此内容参考:https://www.cnblogs.com/bingyimeiling/p/10266949.html)

JDK、JRE、JVM的区别
1、JDK(Java SE Development Kit),Java标准开发包。它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。
    JDK是JRE的超集,提供了更多工具,编译器、诊断工具等等、JRE本身包含了JVM和Java类库。
JDK安装目录
2、JRE( Java Runtime Environment) 、Java运行环境,用于解释执行Java的字节码文件。普通用户而只需要安装 JRE(Java Runtime Environment)来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。
    下图是JRE的安装目录:里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
JRE
3、JVM(Java Virtual Mechinal),Java虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。
    当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码只面向JVM。不同平台的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。

4、区别与联系

  • JDK 用于开发,JRE 用于运行java程序 ;如果只是运行Java程序,可以只安装JRE,无序安装JDK。
  • JDk包含JRE,JDK 和 JRE 中都包含 JVM。
  • JVM 是 java 编程语言的核心并且具有平台独立性。

编译器、解释器

JDK:Java开发包(开发调试程序)
JRE: Java运行时环境(运行程序)
JVM:Java虚拟机,即Interpreter解释器,跨平台的实现

源文件编译器Compiler字节码文件解释器Interpreter执行代码平台
MyProgram.java解释器MyProgram.class编译器运行在计算机上

编译时:使用java编译器
运行时:使用Java解释器,通过网络 Java.class----》类加载器----》字节码校验器----》编译器/JIT代码生成器–》硬件


Java是解释执行还是编译执行?

  • 也许从开始学习JAVA时,我们都学习了JAVA是解释执行的。但是随着java版本版本升级,JVM也在不断的优化。
  • 对于“Java 是解释执行”这句话,这个说法不太准确。
  1. Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),
  2. 在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。

动态编译器

大多数情况使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。


知识点拓展:

Java语言的主要类库

Java平台
JVM 的一些基础概念和机制,比如 Java 的类加载机制

  • 常用版本 JDK(如 JDK 8)内嵌的 Class-Loader,例如 Bootstrap、 Application 和 Extension Class-loader;
  • 类加载大致过程:加载、验证、链接、初始化;
  • 自定义 Class-Loader 等。
  • 垃圾收集的基本原理,最常见的垃圾收集器,如 SerialGC、Parallel GC、 CMS、 G1 等,

上面这些概念本篇内容简单介绍,如果有时间将我对这些的理解编辑一篇新文章。其实JVM对于Java程序的重要性不言而喻。还是要对其有个深入的研究和理解。
推荐书籍:《深入理解 Java 虚拟机》


JVM JDK8中server、client模式的区别。

JVM 会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。

主流 Java 版本中,如 JDK 8 实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。
运行在 server 模式的 JVM,会进行上万次调用以收集足够的信息进行高效的编译,client 模式这个门限是 1500 次。
Oracle Hotspot JVM 内置了两个不同的 JIT compiler,

  1. C1 对应前面说的 client 模式,适用于对于启动速度敏感的应用,比如普通 Java 桌面应用;
  2. C2 对应 server 模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。

JVM 启动参数 -Xint -Xcomp

Java 虚拟机启动时,可以指定不同的参数对运行模式进行选择。

  1. 比如,指定“-Xint”,就是告诉 JVM 只进行解释执行,不对代码进行编译,这种模式抛弃了 JIT 可能带来的性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。
  2. 与其相对应的,还有一个“-Xcomp”参数,这是告诉 JVM 关闭解释器,不要进行解释执行,或者叫作最大优化级别。
  3. “-Xcomp”会导致 JVM 启动变慢非常多,同时有些 JIT 编译器优化方式,比如分支预测,如果不进行 profiling,往往并不能进行有效优化。

JDK9 AOT编译模式

Oracle JDK 9 就引入了实验性的 AOT 特性,并且增加了新的 jaotc 工具。
所谓的 AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码,这样就避免了 JIT 预热等各方面的开销。

//利用下面的命令把某个类或者某个模块编译成为 AOT 库。
jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base

//然后,在启动时直接指定就可以了。
java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

可以参考相关文档:http://openjdk.java.net/jeps/295。

其他

JVM 作为一个强大的平台,不仅仅只有 Java 语言可以运行在 JVM 上,本质上合规的字节码都可以运行,Java 语言自身也为此提供了便利,我们可以看到类似 Clojure、Scala、Groovy、JRuby、Jython 等大量 JVM 语言,活跃在不同的场景。

1.语法
①数据类型,变量
②表达式,语句,代码块,方法
③面向对象:封装、继承、多态
④异常处理、序列化、多线程
⑤集合框架与泛型(数据结构)
⑥包、JAR
⑦分布式、RMI、Servlet、JSP、EJB、Spring

2.类库
①工具类
纯工具:Google Guava
纯工具:Apache common(lang,IO,common)
测试:junit,testng
日志:slf4j + logback
序列化:avro,protobuff
JSON处理:Jackson,Gson
HTTP:apache http compoent

②框架类
应用开发框架:Spring + Spring Boot
REST API开发:Swagger Codegen + Swagger UI
网络框架:Netty
ORM框架:Hibernate,MyBatis / iBatis

3.工具
①maven:构建和打包。
②git:源代码版本控制
③IDE
④Jenkins:自动化持续集成

4.底层进阶
①内存相关
内存堆(Heap)和线程栈
JMM
GC垃圾回收(Garbage Collection)
GC log分析和GC调优

②JVM和Java规范相关
JVM + Java字节码
Class文件格式
Class Loader

③进阶
多线程和线程安全
程序可读性
优化

5.能力(不仅限于某种编程语言)
①本能 + 直觉 :对问题的难度、复杂性和需要的时间有一个直觉的反应。能够快速且准 确的判断问题的难点和可能出问题的地方

②分解 + 架构:拿到一个问题的时候,可以将问题分解为某种编程语言 / 技术可以解决 的子模块 / 功能

③解决问题:任何工作中的问题。从需求分析到架构设计,从接口设计到代码实现,从文档到测试,从脑洞大开到靠谱创新,从内存使用到 CPU占用,从 bug 可以重现到 bug 难以重现,从集成到联调,从数据到环境,从数据库到消息队列,从在线到离线, 从开发到部署,从测试环境的问题到生产环境的问题,从单台机器的问题到集群分布 式的问题,从上线到维护,从技术支持到 hotfix,从性能到监控,从技术栈更新到系统 完全重构。只有想不到,没有做不到

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值