每天进步一点点:“JVM性能调优解析”,分享JVM进阶面试题77问!

前言

Java虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

Java虚拟机不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种API、优化技术等。Java技术使同一种应用可以运行在不同的平台上。Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库。

分享详细解析77道Java面试时常问的JVM题,希望对各位有所帮助,另外我针对当前互联网面试总结一些资料给大家,文末有领取方式(诚意满满)

由于文章篇幅问题,我这里就不一一解析了,需要获取全部答案解析的可以 点击这里 获取文档!


1、java中会存在内存泄漏吗,请简单描述。
2、64 位 JVM 中,int 的长度是多数?
3、Serial 与 Parallel GC 之间的不同之处?
4、32 位和 64 位的 JVM,int 类型变量的长度是多数?
5、Java 中 WeakReference 与 SoftReference 的区别?
6、JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用

当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从32 位增加到了 64 位,因此堆内存会突然增加,差不多要翻倍。这也会对 CPU缓存(容量比内存小很多)的数据产生不利的影响。因为,迁移到 64 位的 JVM主要动机在于可以指定最大堆大小,通过压缩OOP 可以节省一定的内存。通过-XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。

7、怎样通过 Java 程序来判断 JVM 是 32 位 还是 64位?
8、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
9、JRE、JDK、JVM 及 JIT 之间有什么不同?
10、解释 Java 堆空间及 GC?
11、JVM 内存区域

JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。
线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 Hotspot VM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。

线程共享区域随虚拟机的启动/关闭而创建/销毁。

直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 方式, 它可以使用 Native 函数库直接分配堆外内存, 然后使用DirectByteBuffer 对象作为这块内存的引用进行操作, 这样就避免了在 Java堆和 Native 堆中来回复制数据, 因此在一些场景中可以显著提高性能。

12、程序计数器(线程私有)
13、虚拟机栈(线程私有)
14、本地方法区(线程私有)
15、你能保证 GC 执行吗?
16、怎么获取 Java 程序使用的内存?堆使用的百分比?

可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,
Runtime.maxMemory() 返回最大内存的字节数。

17、Java中堆和栈有什么区别?
18、描述一下 JVM 加载 class 文件的原理机制
19、GC 是什么?为什么要有 GC?
20、堆(Heap-线程共享) -运行时数据区
21、方法区/永久代(线程共享)
22、JVM 运行时内存

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和老年代。

23、新生代
24、老年代
25、永久代
26、JAVA8 与元数据
27、引用计数法
28、可达性分析
29、标记清除算法( Mark-Sweep)

最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。如图:

从图中我们就可以发现,该算法最大的问题是内存碎片化严重,后续可能发生大对象不能找到可利用空间的问题。

30、复制算法(copying)
31、标记整理算法(Mark-Compact)
32、分代收集算法
33、新生代与复制算法
34、老年代与标记复制算法
35、JAVA 强引用
36、JAVA 软引用
37、JAVA 弱引用
38、JAVA 虚引用

虚引用需要 PhantomReference 类来实现,它不能单独使用,必须和引用队列联合使用。 虚引用的主要作用是跟踪对象被垃圾回收的状态。

39、分代收集算法
40、在新生代-复制算法
41、在老年代-标记整理算法
42、分区收集算法
43、GC 垃圾收集器
44、Serial 垃圾收集器(单线程、 复制算法)
45、ParNew 垃圾收集器(Serial+多线程)
46、Parallel Scavenge 收集器(多线程复制算法、高效)
47、Serial Old 收集器(单线程标记整理算法 )

Serial Old 是 Serial 垃圾收集器年老代版本,它同样是个单线程的收集器,使用标记-整理算法,这个收集器也主要是运行在 Client 默认的 java 虚拟机默认的年老代垃圾收集器。在 Server 模式下,主要有两个用途:

  • 在 JDK1.5 之前版本中与新生代的 Parallel Scavenge 收集器搭配使用。
  • 作为年老代中使用 CMS 收集器的后备垃圾收集方案。新生代 Serial 与年老代 Serial Old 搭配垃圾收集过程图:

新生代 Parallel Scavenge 收集器与 ParNew 收集器工作原理类似,都是多线程的收集器,都使用的是复制算法,在垃圾收集过程中都需要暂停所有的工作线程。新生代 ParallelScavenge/ParNew 与年老代 Serial Old 搭配垃圾收集过程图:

48、Parallel Old 收集器(多线程标记整理算法)
49、CMS 收集器(多线程标记清除算法)
50、G1 收集器
51、JVM 类加载机制
52、类加载器
53、双亲委派
54、OSGI( 动态模型系统)
55、动态改变构造
56、模块化编程与热插拔
57、JVM内存模型

线程独占:栈,本地方法栈,程序计数器
线程共享:堆,方法区

58、栈

又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方法出口等信息.调用方法时执行入栈,方法返回式执行出栈.

59、本地方法栈

与栈类似,也是用来保存执行方法的信息.执行Java方法是使用栈,执行Native方法时使用本地方法栈.

60、程序计数器

保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行Native方法时,程序计数器为空.

61、堆

JVM内存管理最大的一块,对被线程共享,目的是存放对象的实例,几乎所欲的对象实例都会放在这里,当堆没有可用空间时,会抛出OOM异常.根据对象的存活周期不同,JVM把对象进行分代管理,由垃圾回收器进行垃圾的回收管理

62、方法区
63、分代回收
64、堆和栈的区别
65、什么时候会触犯FullGC
66、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
67、对象分配规则
68、描述一下JVM加载class文件的原理机制?
69、Java对象创建过程
70、简述Java的对象结构
71、如何判断对象可以被回收

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

  • 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
  • 可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

72、JVM的永久代中会发生垃圾回收么
73、垃圾收集算法
74、调优命令有哪些?
75、调优工具
76、Minor GC与Full GC分别在什么时候发生?
77、你知道哪些JVM性能调优

设定堆内存大小
-Xmx:堆内存最大限制。
设定新生代大小。 新生代不宜太小,否则会有大量对象涌入老年代
-XX:NewSize:新生代大小
-XX:NewRatio 新生代和老生代占比
-XX:SurvivorRatio:伊甸园空间和幸存者空间的占比
设定垃圾回收器 年轻代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC


分享一下我的一套学习资料库,大伙看看有没有需要的:

  • Java核心知识点:
  • Java千道面试宝典:

内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈

  • 架构学习资料:
  • 学习视频:

以上这些学习资料都能够免费分享给小伙伴们,希望能一起努力,共同进步!有需要的,直接戳 免费领取

干货分享

你是否经历过这样的场景:

运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!

新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就......想解决线上JVM GC问题,但却无从下手。

每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC,OOM等问题,一脸懵圈!

JVM调优,调的是稳定。
服务稳定的重要性就不用多说了,保证服务的稳定,GC永远会是Java程序员需要考虑的不稳定因素之一。
复杂和高并发下的服务,必须保证每次GC不会出现性能下降,各种性能指标不会出现波动,GC回收规律而且干净,找到合适的JVM设置。
详细了解JVM的话请看神书《深入理解java虚拟机》。
或者直接听诸葛老师(前京东资深架构)的这堂两天两分JVM专题课!直观感受JVM的调优实战

两天突击训练实战课,你能学到:

第一天:亿级流量电商系统JVM性能调优实战
1、深入剖析Java虚拟机内存模型
2、JVM垃圾收集机制解密
3、常见JVM诊断工具调优实战
4、亿级流量电商网站JVM参数调优实战
5、日均百万级交易系统JVM调优实战
6、Java虚拟机常见面试题剖析
7、动手实战优化自己公司线上系统JVM

第二天: 深入理解JVM多线程设计与JMM内存模型
1、CPU多核并发缓存架构剖析
2、Java线程内存模型底层实现原理
3、CPU缓存一致性协议详解
4、深入汇编语言底层理解volatile关键字
5、并发编程的可见性,原子性与有序性详解
6、动手实战优化线上系统高并发程序

适合人群:如果你有Java项目开发经验,想深入理解Java虚拟机并在实际工作中解决线上JVM调优的问题,尤其是想在高并发处理方面提升自己的内功,为开发高性能程序打下深入的基础,那这门短期课程的内容就是你要掌握的。

想参与这场为期两天的短期课程的可以进Q群:909666042 咨询参与,致敬大师,致敬未来的你!

前京东唯品会架构师带你实战JVM调优,帮你积累亿级流量,千万级QPS,百万级TPS互联网系统线上调优经验,从此开启涨薪升级之旅!
让你在简历上可以增加JVM调优经验,从此横扫一切关于JVM面试问题,吊打所有敢于提问JVM的面试官,成为一个行走的offer收割机!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343