JVM学习简要概述
编外话:最近发现面试基本上对3年经验的java工程师都会要求JVM相关的内容,因此想把这部分给总结下,一方面是对自己对于此方面的内容的一个巩固;另一方面也是给相关需要了解这方面的人一个简单的了解。
1、JVM简要的了解
JVM(Java Virtual Machine),即java虚拟机。是java代码运行的核心组成部分。java能够实现跨平台主要是它是基于java虚拟机运行的。JVM相当于是提供一个托管平台,其提供了内存管理,垃圾回收,编译检查等功能。jvm执行主要分为两个部分,1.java编译阶段;2.jvm执行引擎。
java编译阶段:主要的是把.java文件编译成.class文件,加载到java虚拟机中的方法区。
java执行阶段:JVM加载类,JVM执行方法调用;
类加载主要分为三个阶段:加载、链接及初始化;
JVM执行方法主要根据名称,参数及返回类型从方法区中找到方法。
JVM将运行时的区域划分为5个部分,堆空间(方法区,堆),栈空间(PC寄存器、java方法栈,本地方法栈);
2、关于GC
GC(Garbage Collection)JVM提供的自动垃圾回收机制。
目的:清除无用对象所占用的堆空间
识别:什么是无用对象?有两个方式,一个计数法,每个对象都对应一个空间地址的引用。第二个是标记法,从根对象进行标记,如果没有进行标记的对应则表明是垃圾对象。
方法:主要有三种方法:清除,压缩,复制;清除即直接把垃圾对象引用清除掉,缺点容易产生碎片;压缩虽然得到了连续的磁盘空间,但是复杂比较耗性能;复制空间利用率低。
3、GC的解决方案和询查步骤
1、jps
jps [-lmv] 打印正在运行的java进程相关信息。
l 模块名和包名
v 虚拟机参数
m main函数参数
2、jstat 打印java进程的相关内容
jstat -options
#VMID为java进程id
jstat -outputOptions [-t] VMID
例:jstat -gc 10100 1s
查看java进程的类加载、即时编译以及垃圾回收相关信息。常用监测垃圾回收问题以及内存泄露问题
3、jmap 虚拟机堆中的对象
4、jinfo java进程的参数
5、jstack 打印目标java进程的各个线程的栈轨迹 jstack PID
打印目标java进行中各个线程的栈轨迹、线程状态、锁状态,自检死锁等。
6、jcmd 代替jstat
7、GUI(MAT和JMC没有深入的实践)
4、总结
最近在反思,为啥我们一定要了解JVM。其实在大多数开发中,我们只需要会调用java api接口就能够完成我们的业务逻辑实现,而不需要深入的理解JVM。
打个形象的比喻,我们知道F=ma2 。在圆周运动中是F=mv2/r。如果我们能够根据牛二推导出圆周运动的公式,那么对我们记忆和理解圆周运动就更加的深刻。
因此我们前期可以只需要会用,后期一定要深入的去理解这门语言的一些底层。