前言
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收割机!