这一期的主要学习内容是JVM

这一期的主要学习内容是JVM。学习Java的程序员如果不了解JVM,那么永远也算不上一流的程序员。

Java跨平台的、面向对象的一门编程语言,那么这里有一个很重要的一点是Java的跨平台,所谓的平台是指操作系统,如Windows、Linux、Unix……,不同的操作系统,底层的机制是不一样的,那么同样的Java代码,如何能在不同的操作系统上获取相同的结果呢,JVM就是实现这样一个功能的“软件”,Java Virtual Machine——Java虚拟机。

1)底层数据类型

JVM底层的数据类型包含两大部分,基本数据类型和对象类型,基本数据类型包含整数类型、浮点类型、字符类型、布尔类型。

对象类型包含的是一个无限集合,所有非基本类型的都是对象类型,Java数组被当做object处理。虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可移植性。

(2)JVM运行原理

JVM是Java程序运行的容器,但是他同时也是操作系统的一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。

JVM在整个jdk中处于最底层,负责与操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也就虚拟计算机.操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境。

1.创建JVM装载环境和配置

2.装载JVM.dll

3.初始化JVM.dll并挂接到JNIENV(JNI调用接口)实例

4.调用JNIEnv实例装载并处理class

 

JVM运行原理图

(3)JVM内存结构

jvm区域总体分两类,heap区和非heap区。

heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。

非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。

非heap区不做详细的解释,主要是介绍下heap去,也就是JVM的对象存储区。

用户创建的对象,首先会进入EdenSpace(伊甸园)区,GC轮询之后,一直存活的、使用频率很高的对象会被放入Survivor Space(幸存者区)。Survivor Space(幸存者区)的对象,经过GC的轮询,相关的对象会进入Tenured Gen(老年代-养老区)。

 

JVM Heap分配原理图

(4)垃圾回收(GC)

JVM在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的对象,对于短周期的对象,需要频繁地进行垃圾回收以保证无用对象尽早被释放掉,对于长周期对象,则不需要频率垃圾回收以确保无谓地垃圾扫描检测。为解决这种矛盾,Sun JVM的内存管理采用分代的策略。

1)年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Suvivor Space(命名为A和B)。当对象在堆创建时,将进入年轻代的Eden Space。垃圾回收器进行垃圾回收时,扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满,则复制到Old Gen。同时,在扫描Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个持久化对象,则将其移到Old Gen。扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和BSuvivor Space。这么做主要是为了减少内存碎片的产生。

我们可以看到:Young Gen垃圾回收时,采用将存活对象复制到到空的Suvivor Space的方式来确保尽量不存在内存碎片,采用空间换时间的方式来加速内存中不再被持有的对象尽快能够得到回收。
2)年老代(Tenured Gen):年老代主要存放JVM认为生命周期比较长的对象(经过几次的Young Gen的垃圾回收后仍然存在),内存大小相对会比较大,垃圾回收也相对没有那么频繁(譬如可能几个小时一次)。年老代主要采用压缩的方式来避免内存碎片(将存活对象移动到内存片的一边,也就是内存整理)。当然,有些垃圾回收器(譬如CMS垃圾回收器)出于效率的原因,可能会不进行压缩。

 

JVM系统属性:

查看系统属性还可以通过jvisualvm命令

前提:安装jdk,配置环境变量

查看方法:运行-->cmd-->jvisualvm-->打开Java VisualVM-->本地-->VisualVM-->概述-->系统属性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章