JVM 知识点总览 - 高级 Java 工程师面试必备

本贴最后更新于 1730 天前,其中的信息可能已经沧海桑田

来源:jvm 知识点总览-高级 Java 工程师面试必备
作者:纯洁的微笑
版权归作者所有,转载请注明出处

在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功。对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后,内功就更主要了。一个内功低的人招式在奇妙也打不过一个内功高的人。比如,你剑法再厉害,一剑刺过来,别人一掌打断你的剑,你还怎么使剑法,你一掌打到一个武功高的人身上,那人没什么事,却把你震伤了,你还怎么打。同样两者也是相辅相成的,内功深厚之后,原来普通的一招一式威力也会倍增。

对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线;但对于高级程序员来讲,内功的修炼却越发的重要,比如算法、设计模式、底层原理等,只有把这些基础熟练之后,才能在开发过程中知其然知其所以然,出现问题时能快速定位到问题的本质。

对于 Java 程序员来讲,spring 全家桶几乎可以搞定一切,spring 全家桶便是精妙的招式,jvm 就是内功心法很重要的一块,线上出现性能问题,jvm 调优更是不可回避的问题。因此 JVM 基础知识对于高级程序员的重要性不必言语,我司在面试高级开发的时候,jvm 相关知识也必定是考核的标准之一。本篇文章会根据之前写的 jvm 系列文章梳理出 jvm 需要关注的所有考察点。

jvm 总体梳理

jvm 体系总体分四大块:

当然这些知识点在之前的文章中都有详细的介绍,这里只做主干的梳理

这里画了一个思维导图,将所有的知识点进行了陈列,因为图比较大可以点击右键下载了放大查看。

类的加载机制

主要关注点:

什么是类的加载

类的加载指的是将类的.class 文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class 对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的 Class 对象,Class 对象封装了类在方法区内的数据结构,并且向 Java 程序员提供了访问方法区内的数据结构的接口。

类的生命周期

类的生命周期包括这几个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程,如下图:

类的生命周期

几个小问题?
1、JVM 初始化步骤 ? 2、类初始化时机 ?3、哪几种情况下,Java 虚拟机将结束生命周期?
答案参考这篇文章 jvm 系列(一):java 类的加载机制

类加载器

类加载器

类加载机制

jvm 内存结构

主要关注点:

jvm 内存结构

方法区和对是所有线程共享的内存区域;而 java 栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。

对象分配规则

如何通过参数来控制个各个内存区域
参考此文章:jvm 系列(二):JVM 内存结构

GC 算法 垃圾回收

主要关注点:

对象存活判断

判断对象是否存活一般有两种方式:

GC 算法

GC 最基础的算法有三种:标记 -清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法。

垃圾回收器

GC 算法和垃圾回收器算法图解以及更详细内容参考 jvm 系列(三):GC 算法 垃圾收集器

GC 分析 命令调优

主要关注点:

GC 日志分析

摘录 GC 日志一部分(前部分为年轻代 gc 回收;后部分为 full gc 回收):

2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs] 
2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs] 

通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen 属于 Parallel 收集器。其中 PSYoungGen 表示 gc 回收前后年轻代的内存变化;ParOldGen 表示 gc 回收前后老年代的内存变化;PSPermGen 表示 gc 回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回城,耗时长,因此一般尽量减少 full gc 的次数


调优命令

Sun JDK 监控和故障处理命令有 jps jstat jmap jhat jstack jinfo

详细的命令使用参考这里 jvm 系列(四):jvm 调优-命令篇

调优工具

常用调优工具分为两类,jdk 自带监控工具:jconsole 和 jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto。

工具使用参考 jvm 系列(七):jvm 调优-工具篇

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2989 引用 • 8141 回帖 • 596 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    170 引用 • 118 回帖 • 2 关注

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Vanessa 1
    订阅者

    不想做 Java 高级,飘过

    1 回复
  • jiangzezhou 1

    每次面试,都诚实告知,没有线上 jvm 调优经验,理论多于实践,而且理论都记不住。。。应该因为这个少了很多钱

    1 回复
  • whxiaobu 1
    作者

    咦,我今天回帖了啊。怎么没有回复上去。。。。。。再回复一次!

    你慢慢飘。我就在地上仰望!

  • whxiaobu 1
    作者

    太实在了!

  • lijp 1

    学习

  • lixudong 1

    不错

  • moreandmore 1

    java 新手 表示看的一头雾水

  • Derobukal 1

    学习学习~~~

请输入回帖内容 ...