java认知描述_Java技术:JVM的初步认识

1. 什么是JVM
与JVM的初次见面,是在我们Java SE的开始,认识Java跨平台原理的时候.时隔多日,我们先来回顾一下.
Java的广告语是,"编写一次,到处运行",而它凭借的就是JVM(Java).而对于不同的平台,,Linux,Mac OS等,有具体不同的JVM版本.这些JVM屏蔽了平台的不同,提供了统一的运行环境,让Java代码无需考虑平台的差异,运行在相同的环境中.
下图即官网下载JDK 8时所需要进行选择的页面
而至于JRE和JDK,就不再赘述了,包含关系应该很清楚的,而今天我们的重点就在于对JVM的进一步认识以及对它进行优化调整.
2. 为什么要优化JVM
正如前面我们所回顾的,我们的Java代码都是运行在JVM中的,而部署的硬件及应用场景有所不同时,仍然采用默认的配置不见得能起到最好的效果,甚至可能会导致运行效率更差,又或者面临高并发情况下,想让程序平稳顺畅的运行,所以我们需要针对实际的需要来进行优化.
3. 分析工具
我们只知道有JVM的存在,但它的运行对于我们来说感觉像是摸不着看不见的,所以我们需要借助工具来监控它的一个实时状态,就像的性能监视器一样,JDK也有自己的可视化工具.
我们以管理员身份运行DOS
输入,将Java 启动
在这里我们可以看到
本地列表中有多个条目,而一眼也可以看到我们项目的main方法,直接双击
经过短时间的加载后,得到这样一个界面
这个是概述页面,可以得到很多信息,但对于我们分析JVM的运行还是没有什么帮助,所以我们切换到监视页
监视页展示的就是实时的JVM信息,应该还是很直观的
现在安装插件,插件的安装属于的一个重要功能,凭借插件我们可以将这个工具的功能变得更强大 。
打开工具->插件;选择"可用插件"页;我们在这里安装一个 GC,方便我们看到内存回收以及各个分代的情况;打上勾之后点击安装,就是常规的next以及同意协议等,网络不是很稳定,有时候可能需要多尝试几次 。
安装完成后我们将当前监控页关掉,再次打开,就可以看到后面多了一个 GC页 。
在这里我们可以看到JIT活动时间,类加载活动时间,GC活动时间以及各个分代的情况 。
需要注意的是,当前课件使用的JDK版本为1.8,仍然自带了,从1.9开始的版本是没有自带的,需要额外下载,下载的地址:
另外,如果开发工具使用的是 IDEA的话,可以下载一个插件, ,通过插件启动可以直接到上述页面,不用在左边的条目中寻找自己的项目.
当然也有其他的工具,但这个在可预见的未来都会是主力发展的多合一故障处理工具.所以我们后面将会使用这个工具来分析我们的JVM运行情况,进而优化.而需要优化我们还需要对JVM的组成有进一步的了解.接下来我们来看一下JVM的组成
4. JVM组成
从图上可以看到,大致分为以下组件:
类加载器子系统运行时数据区执行引擎本地方法库而本地库接口也就是用于调用本地方法的接口,在此我们不细说,主要关注的是上述的4个组件
4.1类加载器子系统
顾名思义,这是用于类加载的一个子系统.
4.1.1类加载的过程
类加载的过程包括了加载,验证,准备,解析和初始化这5个步骤
1. 加载:找到字节码文件,读取到内存中.类的加载方式分为隐式加载和显示加载两种 。隐式加载指的是程序在使用new关键词创建对象时,会隐式的调用类的加载器把对应的类加载到jvm中 。显示加载指的是通过直接调用class.()方法来把所需的类加载到jvm中 。
2. 验证:验证此字节码文件是不是真的是一个字节码文件,毕竟后缀名可以随便改,而内在的身份标识是不会变的.在确认是一个字节码文件后,还会检查一系列的是否可运行验证,元数据验证,字节码验证,符号引用验证等.Java虚拟机规范对此要求很严格,在Java 7的规范中,已经有130页的描述验证过程的内容.