JVM 面试问题,背完去面试(面试篇 一)

首先声明,该博客用于对JVM有了解的人,本文也是根据B站某班的老师讲的内容,进行了总结。将概念理论,大家自己去查找,我也可以发你地址(很多视频,不说讲的不好,实在是在摸鱼,纯粹浪费时间,而有些博客写的实在是看不下去,还是错的)。

基于我自己的理解,做了一些简单的总结,你可以背完去面试,但是不建议。很多东西你得有自己的认识,下面涉及的很多概念,都需要一定的基础。内容是用MarkDown写的复制进来的,它自己识别了,textarea还不挺不错的。


- 谈谈你对JVM的认识。题目很大,等于没问
1. 首先,JVM(Java Virtual Machine)java虚拟机,但是也不能说只能运行Java程序。JVM其实是运行字节码文件的平台,kotlin,Croovy都可以。
编译成字节文件都可以在JVM上运行。HotSpot为例,其实别的jvm虚拟机也得遵循规范。
2. 从java文件运行的过程进行分析,首先将java文件编译成.class文件,由类加载器class_content,加载进内存,加载进方法区,方法区里面有常量池和一些其他静态变量属性。
3. 方法区的实现,以前是永久代属于堆。现在是元空间,直接物理内存控制,空间更大,不容易OOM。占据20.75M ~ 1/32物理空间。
4. 在程序运行的过程中,有运行时数据区,里面有常说的堆栈,程序计算器。栈分为虚拟机栈,本地方法栈JNI(以前写安卓的时候调用过,写后台就没有用了)。
5. 在虚拟机栈中,当前线程通过将变量压入局部表,操作数栈控制变量的执行过程,程序计数器记录了程序的执行位置索引。
6. 假设当前线程存在子线程,会为每个线程开辟一个栈帧的空间。当前的局部表和操作数栈的指针的索引,程序计算器会进行转移,等到当前线程结束
才会返回,程序计数器会有新的索引。栈帧里面的动态链接堆里面的对象new Obj(),栈存放了堆对象的索引。
7. 堆分为新生代和年老代,新生代又有Eden区,From以及TO区,8:1:1,大部分对象在Eden区域就会被回收,四种对象的类型。开始垃圾回收。栈是不存在垃圾回收问题的。新老比例1:2,能够合理的利用内存空间。
8. 垃圾回收算法
标记清除(基本不用了,浪费内存,细粒度空间),复制,标记整理,以及分代算法(整合前面三个),复制算法用在young里面的From To,标记整理用在年老代
9. JVM调优
 选择合适的垃圾收集器:Serial Parallel 串行 并行,JDK1.8默认Parallel Scavenge,保证吞吐量(codeT:cpuT),还有他们对应的Old。
 还有CMS(并发),以低停顿为目的。多次标记过程
 目前的G1(电商里面),能够控制低停顿的时机,筛选回收机制。
 ZGC JDK11
10. 首先是指针压缩,对象可以分为对象有,实例数据区(我的理解为栈区域),对齐填充区域。
 对象头包括MarkDown8字节,类型指针(指针压缩,线性地址),数组长度(对齐填充),然后实例数据区以及对齐填充。 
11. 字节码文件的组成,magic minor margor 常量池,权限控制。接下来就是接口,属性对象,属性方法,以及属性对照规范表和jclasslib可以分析Java代码是如何运行的。
  调的是堆里面的优,堆是线程共享
12. 一些常见的堆栈设置
   javac javap -XX:+PrintFlagsFinal Jinfo JStat VisualVM 分析等等
   vm options的配置 -Xss -Xms 等
13. OOM类型 Heap  Stack 常量池 直接内存溢出 四大类  
14.JVM调优的目的:
 增加吞吐量,减少停顿时间(CMS和G1)。查看日志分析FullGC的存在,可是G1几乎没有FullGC,那你就去调试重新标记和刷选回收那块。EasyGC工具。还有一些常用的指令。

本文也可能存在一定的错误,希望大家不吝赐教,谢谢!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章