前言
Java crashesThe virtual machine is responsible for emulating a CPU, managing memory and devices, just like the operating system does for native applications (MS Office, web browsers etc).
轮廓
- class文件
- 类加载
- oop-kclass模型,gc
- 并发实现,同步器,unsafe
- 一般Linux进程与jvm进程
jvm 在体系中的位置
程序设计语言的发展就是一个“逐步远离计算机硬件,向着待解决的问题靠近”的过程。
jdk 安装目录含义
Class loaders are responsible for loading Java classes during runtime dynamically to the JVM (Java Virtual Machine). Also, they are part of the JRE (Java Runtime Environment). Hence, the JVM doesn’t need to know about the underlying files or file systems in order to run Java programs thanks to class loaders. 潜台词:Class loaders 是jre 类库的一部分但不是JVM 的一部分
逐步“消亡的”JVM
java编译器只是将java 代码编译为字节码,然后交给jvm解释执行(当然也有一部分的JIT)。
- 使得任何时候运行java 代码都需要装一个jdk
- 解释执行速度偏慢
阿里、华为(方舟)、GraalVM将 Java 程序编译为本地代码,在运行时无需传统 Java 虚拟机和运行时环境,只需操作系统类库支持即可。jvm 不再成为运行java 代码的标配。
更快的垃圾回收 ZGC
java 不再是那个熟悉的java
重塑云上的 Java 语言 阿里jvm团队做的一些工作
- ElasticHeap, Java 常因为耗资源而受诟病,其中最显著一点就是 Heap 对内存的占用,即便没有请求在处理也没有对象分配,进程仍然会保留完整的堆内存空间,保障 GC 进行分配内存和操作内存的快速敏捷。ElasticHeap 优化了Heap 的管理,让java 更“轻”一点
-
Wisp2,Java 同样可以拥有高性能的协程
- 在整个Java runtime中支持了协程调度,线程(比如 Socket.getInputStream().read() )阻塞会变成更轻量的协程切换。
- 完全兼容 Thread API ,在开启 Wisp2 的 JDK 中,Thread.start() 实际创建的是一个协程
- 支持 work stealing
- Grace,一个jvm监控、debug平台
体会
就像数据库系统百花齐放但SQL语法却宝刀不老一样。java 能保留的,最终也可能只剩下语法,通过对编译器、jvm等进行改造使上层代码“永葆青春”。
学习程序设计语言其实就是要学习语言提供的编程模型,不提供新编程模型的语言是不值得刻意学习的。
- C 语言提供了对汇编指令直接的封装。
- C++ 先是提供了面向对象,后来又提供了泛型编程。
- Java 把内存管理从开发者面前去掉了,后来引入的 Annotation 可以进行声明式编程。
- Ruby 提供了动态类型,以及由 Ruby on Rails 引导出的 DSL 风格。
- Scala 和 Clojure 提供了函数式编程。
- Rust 提供了新的内存管理方式,而 Libra 提供的 Move 语言则把它进一步抽象成了资源的概念。
一旦对于程序设计语言的模型有了新的认识,你就能理解一件事:一切语法都是语法糖。
- 类型是一种对内存的解释方式。
- class/struct 是把有相关性的数据存放到一起的一种数据组织方式。
- Groovy、Scala、Kotlin、Clojure 等 JVM 上的新语言,提供了一种不同于 Java 的封装 JVM 的方式。