面试时候总喜欢问的JVM要点在哪?(上)

简介: 面试的时候,很多面试官问 JVM 的时候,我们作为一个开发者,很多时候很难 Get 到面试官提问的要点,因为 JVM 确实太多了,从程序计数器开始,然后堆,然后栈,但是面试的时候却总是回答不好这个问题,很多情况就是没有系统的去看过所以回答面试题的时候,会出现语无伦次,这一块内容,那边一块内容,总是回答不好,几天阿粉就来分享给大家一个 JVM 的面试教程,对你有用的话,点赞关注和收藏一波。

面试的时候,很多面试官问 JVM 的时候,我们作为一个开发者,很多时候很难 Get 到面试官提问的要点,因为 JVM 确实太多了,从程序计数器开始,然后堆,然后栈,但是面试的时候却总是回答不好这个问题,很多情况就是没有系统的去看过所以回答面试题的时候,会出现语无伦次,这一块内容,那边一块内容,总是回答不好,几天阿粉就来分享给大家一个 JVM 的面试教程,对你有用的话,点赞关注和收藏一波。

你对 JVM 了解么?

首先,问这个问题的,一般都是问完了一些基础了,这时候需要你自己从头开始说 JVM 了,很多人实际上想到就是垃圾回收机制,确实,没错,但是,如果你直接就开始说是不是垃圾回收机制的时候,就已经有点答非所问了。

为什么这么说,因为 JVM 的垃圾回收机制,都是发生在 堆内存 的,但是,JVM 的划分可不是只要堆内存的,这时候回答应该怎么回答?

** JVM 的内部结构,最主要的内部结构是什么!**

JVM 分成了两个部分

1.线程共享区域

2.线程私有区域

线程共享区域包含:堆(Heap)、方法区

线程私有区域包含:程序计数器、虚拟机栈(Stack)、本地方法栈

因为 JVM ,那可是不单单只有 堆(Heap) 的存在呀,其他的存在也是不可缺少的,为什么阿粉要这么说呢?

因为有些面试官会问 JVM 的类加载机制 你了解么?

如果你只是了解了垃圾回收机制的话,那你这个问题,是不是有点麻了,有点懵了,这不就芭比Q 了么?

那么 JVM 的类加载机制 是个什么呢?

回答:

首先通过类加载器(ClassLoader)会把 .class字节码文件加载到内存中——运行时数据区(Runtime Data Area),而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

跑偏了,我们继续回答上一个问题,既然你说你了解了,你也回答了都有哪些内部结构了,是不是就该说说这些内容是干啥的了,对,没错,就是这么回答。

  • 程序计数器:记录线程执行的位置,方便线程切换后再次执行
  • 虚拟机栈(Stack):每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用
  • 本地方法栈:是为了执行native方法所服务的

说完这个,没啥事别停顿,如果你停顿了,这时候面试官很有可能接着去问你栈的一些特性,你本身是想说垃圾回收机制的,总不能被带跑偏吧,所以,继续往下说。

  • 方法区 :线程共享,存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等等

最后我们再说堆(Heap)

堆是 JVM 中最主要的区域了,因为堆(Heap)是 Java 虚拟机所管理的内存中最大的一块。

唯一目的就是储存对象实例和数组(JDK7 已把字符串常量池和类静态变量移动到 Java 堆),几乎所有的对象实例都会存储在堆中分配。

但是呢,随着 JIT 编译器发展,逃逸分析、栈上分配、标量替换等优化技术导致并不是所有对象都会在堆上分配。

这时候,一般面试官都会开始提问了,就会让你具体的说说堆内存。

Java Heap 堆

Java 堆是垃圾收集器管理的主要区域。堆内存分为新生代 (Young) 和老年代 (Old)

什么是新生代?

主要是用来存放新生的对象。一般占据堆空间的1/3,由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。

什么是老年代?

老年代的对象比较稳定,所以MajorGC不会频繁执行。

那么我们在分别来介绍一下 JVM 的新生代 和 老年代,就这两个,足够你和面试官聊上十几分钟的内容了。

JVM 的新生代(垃圾回收机制)

新生代分为Eden区、ServivorFrom、ServivorTo三个区。

  • Eden区Java新对象的出生地(如果新创建的对象占用内存很大则直接分配给老年代)。当Eden区内存不够的时候就会触发一次MinorGc,对新生代区进行一次垃圾回收。
  • ServivorFrom区上一次GC的幸存者,作为这一次GC的被扫描者。当JVM无法为新建对象分配内存空间的时候(Eden区满的时候),JVM触发MinorGc
  • ServivorTo区
    保留了一次MinorGc过程中的幸存者。

那么新生代会使用什么样子的垃圾回收机制呢?

我们每次new对象的时候都会先在新生代的Enden区放着也就是最开始 是这样子的

94.jpg

然后在Enden用完的时候里面会出现待回收的

95.jpg

然后就来了把存活的对象复制放到Survior1(from)中,待回收的等待给他回收掉 就是这样的

96.jpg

然后把Enden区清空回收掉

97.jpg

这样的话 第一次GC就完成了,下面再往下走

当Enden充满的时候就会再次GC

先是这个样子的

98.jpg

然后会把 Enden和Survoir1中的内容复制到Survior中,

99.jpg

然后就会把Enden和Survior进行回收

100.jpg

然后从Enden中过去的就相当于次数少的,而从Survior1中过去的就相当于移动了2次

101.jpg

这样新生代的GC就执行了2次了,

当Enden再次被使用完成的时候,就会从Survior2复制到Survior1中,

接下来是连图

103.jpg

相关文章
|
1月前
|
监控 算法 Java
JVM相关面试题
JVM相关面试题
36 1
|
22天前
|
算法 前端开发 Java
JVM面试必备
JVM面试必备
|
1天前
|
存储 监控 算法
架构面试题汇总:JVM全套(2024版)
架构面试题汇总:JVM全套(2024版)
6 0
|
7天前
|
存储 Java 编译器
【搞定Jvm面试】 面试官:谈谈 JVM 类文件结构的认识
【搞定Jvm面试】 面试官:谈谈 JVM 类文件结构的认识
|
1月前
|
设计模式 NoSQL Java
京东面试:如何进行JVM调优?
JVM 调优是一个很大的话题,在回答“如何进行 JVM 调优?”之前,首先我们要回答一个更为关键的问题,那就是,我们为什么要进行 JVM 调优? 只有知道了为什么要进行 JVM 调优之后,你才能准确的回答出来如何进行 JVM 调优? 要进行 JVM 调优无非就是以下两种情况: 1. **目标驱动型的 JVM 调优**,如,我们是为了最短的停顿时间所以要进行 JVM 调优,或者是我们为了最大吞吐量所以要进行 JVM 调优等。 2. **问题驱动型的 JVM 调优**,因为生产环境出现了频繁的 FullGC 了,导致程序执行变慢,所以我们要进行 JVM 调优。 所以,针对不同的 JVM 调
39 1
|
1月前
|
Java 数据库连接 Spring
K8S+Docker理论与实践深度集成java面试jvm原理
K8S+Docker理论与实践深度集成java面试jvm原理
|
1月前
|
存储 监控 安全
21个 JVM 技术点详解(附面试解答)
以上V哥给大家详细介绍了 JVM 中涉及的21个点,全网还没有针对 JVM 这样来梳理的内容,希望对你深入了解 JVM 有一定帮助,另,V 哥给大家推荐一本《深入 JVM 虚拟机》的书籍,可以作为工具书使用,高阶的 Java 程序员几乎人手一本。今天的分享就到这里,任何疑问欢迎与 V 哥一起交流,畅谈 Java 人生。
|
1月前
|
缓存 算法 Java
这些年背过的面试题——JVM篇
本文是技术人面试系列JVM篇,面试中关于JVM都需要了解哪些基础?一文带你详细了解,欢迎收藏!
|
7天前
|
设计模式 SQL JavaScript
java面试宝典全套含答案
java面试宝典全套含答案
|
7天前
|
存储 Java
java面试题大全带答案_面试题库_java面试宝典2018
java面试题大全带答案_面试题库_java面试宝典2018