JVM(Java虚拟机)简单来说就是运行Java代码的解释器,作为螺丝钉程序员JVM其实了解下就差不多啦,不懂JVM内部细节照样能写出优质的代码!但是一到造火箭、飞机的场景(面试)不懂JVM的你,会被面试官虐的体无完肤,下面列举7道超高频率的JVM面试题:
- 说一JVM的内存结构是什么样子的?
- 什么时候对象可以被收回?
- 常见的垃圾回收器算法有哪些,各有什么优劣?
- 什么时候对象会进入老年代?
- 判断对象是否已死?
- 什么是空间分配担保策略?
- 如何优化减少Full GC?
面对这一大波JVM面试题,你真的Hold住吗?~~
下图是JVM性能优化的学习思维脑图(xmind)
JVM性能优化学习思维脑图
01 JVM的内存结构是什么样子的?
JVM内存结构可以大致可划分为线程私有区域和共享区域,线程私有区域由虚拟机栈、本地方法栈、程序计数器组成,而共享区域由堆、元数据空间(方法区)组成。
虚拟机栈/本地方法栈
当你碰到过StackOverflowException这个异常的时候,有没有思考下为什么会出现这样的异常呢?答案就在虚拟机栈中,JVM会为每个方法生成栈帧然后将栈帧压入虚拟机栈中。
举个粟子:假设JVM参数-Xss设置为1m,如果某个方法里面创建一个128kb的数组,那这个方法在同一个线程中只能递归4次,再递归第五次的时候就会报StackOverflowException异常,因为虚拟机栈的大小只有1m,每次递归都需要为方法在虚拟机栈中分配128kb的空间,很显示到第五次的时候就空间不足了。
程序计数器
程序计数器是一个记录着当前线程所执行的字节码的行号指示器。JVM的多线程是通过CPU时间片轮转(即线程轮流切换并分配处理器执行时间)算法来实现的。也就是说,某个线程在执行过程中可能会因为时间片耗尽而被挂起,而另一个线程获取到时间片开始执行。
简单的说程序计数器的主要功能就是记录着当前线程所执行的字节码的行号指示器。
方法区(元数据区)
方法区存储了类的元数据信息、静态变量、常量等数