JVM概要


文章目录

        • JVM面试
        • 为什么讲JVM?
        • JVM参数
        • JVM内存模型
        • 内存结构
        • 垃圾回收的算法
        • JVM内存泄漏

JVM面试 JVM:Java Virtual Machine
在面试中会JVM是经常被问的,关于JVM的常问问题一般有:
  • JVM的内存结构;
  • 常用参数;
  • 垃圾回收机制以及算法以及各个算法的对比
  • JVM调优
以上四个问题占了80%,都回答出来已经差不多了。
在这里我自己使用的都是JDK1.8。
切记:JVM不同的版本,它的差别是非常大的。以8为主,跟7对比,跟9对比。面试的时候先说你的版本是什么。
官方文档:https://docs.oracle.com/javase/8/docs/(文档比较乱,需要仔细找)
比如查看jps命令的使用:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html
再比如查看jinfo的使用(也可以–help查看)
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html
其中有篇文章一定要看的:
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/index.html
为什么讲JVM? 1)面试必备 大数据,Hadoop/storm等都是运行在JVM之上的,Spark也是;
2)性能调优 工作中,是非常重要的,调好的话性能提升非常大,不同的版本参数不一样,当版本发生变化时,要调很多参数。比如,版本发生变化时,不修改,可能导致spark代码提交的时候会非常慢,网页上看的时候GC时间特别长
参数举例:Hadoop里面设置JVM堆的大小的参数是什么?hadoop-env.sh里面的export HADOOP_HEAPSIZE=(默认1000M,有时候需要调整的)
某台机器上面作业跑的非常慢,负载非常高?Linux命令用top看的时候,有个参数load average:后面三个参数。Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。
JVM概要
文章图片

有时候负载很高,有时候cpu飙得很高,memory爆掉了等等,那怎么办?
3)性能监控/调整
举个例子,当一个作业跑着的时候突然卡死,或者变慢,你的代码里面的log4j没打日志,让你去定位代码里面哪个方法里面的哪个变量出现了问题,是很难定位的。线上服务不能重启的,重启的话肯定会影响整个LSA的。那么有没有办法去直接去调整运行中代码的字节码(.class文件),字节码是跑在JVM里面的。那么直接通过JVM把里面相关的东西给修改掉,这样的话就不需要重启,这样就可以非常方便的定位哪个方法里的哪个变量出现了问题。
JVM参数 比如jinfo、jstat、jmap等
JVM里的参数类型
1)标准参数
什么叫标准参数,举个例子:java -version 或者java -help会出现很多参数,这些参数是不会变的。标准参数和这些类似。
2)X参数
可能会变,但是变得又不多,比如:
JVM概要
文章图片

从上面可以看到加上-X有很多模式,解释模式去执行你的代码,编译模式去执行你的代码,混合模式去执行你的代码(这件事情是解释还是编译交由JVM来处理)。
那么Java是解释执行的还是编译执行的?不能确定,因为有个mixed混合执行。
3)XX参数
举例:标准写法
-XX:[±]UseG1GC :表示把UseG1GC这个参数给启用或者禁用
还有一些参数是这样写:
-XX:MaxPermSize=64m :表示把MaxPermSize这个参数设置成64M
-Xmx 、-Xms、-Xss这三个参数是属于XX参数类型里面的。
其中-Xms 就相当于 -XX:InitalHeapSize(JVM初始化堆大小)
-Xmx 就相当于 -XX:MaxHeapSize(JVM最大堆大小)
-Xss 就相当于 -XX:ThreadStackSize(JVM线程)
举个例子:
jps查看到某个pid(jps命令是查看Java进程用的),然后ps -ef查看这个pid的相关信息,可以看到很多相应的参数设置,如下:(jinfo -flags 直接跟pid可以列出所有的)JVM概要
文章图片

比如:如何查看某个进程使用的什么GC ?
可以这样看,先查到这个进程的进程号,然后可以这样:
jinfo -flag 进程号 UseG1GC
jinfo -flag 进程号 UseParallelGC
jinfo -flag 进程号 UseConcMarkSweepGC

可以看一下这个进程使用了那种GC。
以上讲的是JVM的参数类型。
JVM内存模型
参考官网:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
内存模型如下图:
JVM概要
文章图片

.class字节文件通过CLASS LOADER加载进来之后,进入运行时数据区。运行时数据区并不是真正的内存结构,它只是定义了一个规范。
运行时数据区必看文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5

内存结构 JDK1.8的的JVM内存结构图如下:
JVM概要
文章图片

垃圾回收的算法 垃圾回收的算法有哪些?
标记清除
复制
标记整理
分代垃圾回收
不同的区采用不同的垃圾回收机制。
JVM内存泄漏 【JVM概要】举例:在java里面new了一个对象,你的指针一直都持有这个对象,不再使用且不再回收,这个指针一直被其它对象所持有,自动的垃圾回收机制无法把这个对象给释放掉。慢慢的越积越多,到最后占到JVM很多空间,其它代码就无法运行了。想办法找到这个对象并修改代码。这个案例在hive里面经常见到。

    推荐阅读