搞清楚Java虚拟机的基本概念是十分必要的,知道Java程序为什么是跨平台的,Java语言的特性等,这些都是对以后的开发十分有帮助的,文本以sun公司的HotSpot虚拟机为例。

什么是JDK,JRE,JVM?

JDK

JDK(Java Development Kit)是Java语言的软件开发工具(SDK)。

JRE

JRE(Java Runtime Environment)是Java运行时环境(并不是一个开发环境)。JRE也可以说是运行Java程序的最小环境。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和lib和起来就是jre。

image.png

JVM

JVM(Java Virtual Machine)是Java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class文件,这种类文件可以在虚拟机上执行。

image.png

Java的优点

  • OOA–面向对象的分析,OOD–面向对象的设计,OOP–面向对象的编程。
  • 体系结构中立:Java之所以能够实现Write Once,Run EveryWhere ,是因为源代码的默认编译结果并非是可执行代码(本地机器指令),而是具有平台通用性的字节码。尽管不同平台的Java虚拟机内部实现机制不尽相同,但是它们共同解释出来的字节码却是一样的。
  • 安全性:因为java只能够运行在Java虚拟机上,这与实际的物理宿主环境之间是相互“隔离”的,因此可以禁止很多不安全的因素,有助于防止错误的发生。增强程序的可靠性。同时java的部分语法限制也在某种意义上保障了程序的安全:废弃指针、自动内存管理、边界检查、类型转换检查、线程安全机制和物理环境访问限制等

字节码(二进制文件):任何编程语言的编译结果满足并包含java虚拟机的内部指令集、符号表以及一些其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。在大部分情况下,字节码更多是存储在本地磁盘文件中,比如后缀名.class 文件。每个字节码文件都对应着全局唯一的一个类或者接口定义的信息,但是类和接口不一定只能存储在文件里,还可以通过类装载器直接运行时生成

JVM的生命周期

  • 启动:任何一个拥有mian函数的class都可以作为JVM实例运行的起点。
  • 运行:main函数为起点,程序中的其他线程均有启动,包括daemon守护线程和non-daemon普通线程。daemon是JVM自己使用的线程比如GC线程,main方法初始线程是non-daemon。
  • 消亡:所有线程终止时,JVM实例结束生命。

Java程序的运行流程

java程序代码的运行过程图如下:

img

查看虚拟机内存使用工具JProfiler

下载地址下载之后进行安装,然后按照[IntelliJ IDEA集成JProfiler,入门教程]教程安装即可。

IDEA集成JProfiler :

image.png

启动:

image.png

图形化界面:

image.png

参考资料

[纯洁的微笑](http://www.ityouknow.com/jvm.html)

https://www.jianshu.com/p/62f9db4d1df3

https://www.jianshu.com/p/380fa5c92dcc

https://www.jianshu.com/p/f07c7acd6828