NingG +

Understanding the JVM:走进Java

Java几个特点

从Java语言的几个特点说起:

一次编写,到处执行

Java:Write Once,Run Anywhere,归根结底是在JVM上运行的。整体几个过程:

即,“一次编写,到处执行”的口号,实际是,有JVM的地方才能执行,因为其依赖于JVM。关于上述3个过程,有几个小问题:

内存管理

Java提供相对安全的内存管理和访问机制,主要是几个术语:

疑问:程序占用的内存,不用主动释放?例如:obj = new Class();

热点代码

Java实现了热点代码检测、运行时编译及优化,能够实现:Java应用程序随应用运行时间的增加而获得更高的性能。

疑问:

第三方类库

Java有丰富多样的第三方类库,实现各种功能。(举几个例子?)

两个名词:JDK、JRE

说两个术语JDK和JRE:

再说两个称呼吧:

JDK的发展过程

JVM

几个熟知的Java Virtual Machine:

HotSpot VM

重点说一下HotSpot VM,两个点:

疑问:编译器、解释器,作用是什么?(以java编写、执行过程来说明)

说一个有意思的:Java语言能够实现Java语言本身的运行环境吗?几个思考:

JVM,java运行环境,语言自身实现其运行环境,元循环,Meta-Circular,两个例子:JavaInJava虚拟机,Maxine VM。

Google Android Dalvik VM

说几点吧,列一下清晰一些:

思考:寄存器架构,和栈架构之间的区别?

简单说一下:指令集不同

Dalvik VM与Java之间有千丝万缕的联系:

JAVA当前重要进展

多核并行

背景

CPU硬件的发展方向,已经从单CPU高频率转向为多核心,随着多核时代来临,软件开发越来越关注并行编程领域。

JAVA API与Lambda函数式编程

JDK 1.5中引入java.util.concurrent包,实现一个粗粒度的并发框架;JDK 1.7中引入java.util.concurrent.forkjoin包,Fork/Join模式是处理并行编程的经典方法。

疑问:Fork/Join模式,是经典的并行编程方法?怎么说?

  1. Fork/Join,是分治思想的一种,跟 Map/Reduce 类似
  2. Fork/Join,以计算能力为中心,充分利用空闲的计算能力,一个任务队列执行完了,就从其他任务队列偷取任务;
  3. Map/Reduce,以数据为中心,认为所有的线程执行能力是等同的,只要给相同的数据量,处理时间就相同;

极其重要进展:Java 8 中,提供Lambda函数式编程,函数式编程的重要有点是:程序天然的适合并行运行;这将有助于Java在多核时代继续保持主流语言的地位。

疑问:函数式编程语言,为什么,天然适合并行运行

  1. 函数式编程,基本但愿是函数,函数是无状态的,始终是线程安全的
  2. 线程安全的代码,可以任意的分布在多核 CPU 上运行

64位JVM

背景

主流CPU开始支持64位架构,一个问题:32位、64位CPU是怎么衡量的?

效果

64位虚拟机有什么好处?更多的计算资源?更多的内存空间?超过4G的内存空间,就必须要使用64位JVM?

与32位JVM相比,64位JVM几个地方需要考虑:

上面的结果是:64位JVM占用更多内存(额外10%~30%)。(具体什么原因?)

编译自己的JDK

JDK的很多底层方法是本地化的(native),如何跟踪这些方法?需要编译一下JDK源码。

参考来源

Top