面试官:说一下你们线上JVM是如何优化的?一不小心聊了2个小时!!
说一JVM的内存模型是什么样子的?什么时候对象可以被收回?常见的垃圾回收器算法有哪些,各有什么优劣?什么时候对象会进入老年代?什么是空间分配担保策略?如何优化减少Full
GC?面对这一大波JVM面试题,你真的Hold住吗?
这里把重要的知识点都写出来了,不管是核心知识点也好还是面试题也好,让大家对知识框架有个基本轮廓
同时也整理了283页的PDF文档,也是Java的核心知识点。
需要的朋友可以,点击这里领取!!!,暗号是:CSDN
JVM的内存模型是什么样子的?
JVM内存模型可以大致可划分为线程私有区域和共享区域,线程私有区域由虚拟机栈、本地方法栈、程序计数器组成,而共享区域由堆、元数据空间(方法区)组成。
再有人问你JVM的内存模型就回想下上面的图,但是知道JVM的内存模型的样子还是不行的,还要知道他们分别干什么的。
虚拟机栈/本地方法栈
当你碰到过StackOverflowException这个异常的时候,有没有思考下为什么会出现这样的异常呢?答案就在虚拟机栈中,JVM会为每个方法生成栈帧然后将栈帧压入虚拟机栈中。
举个粟子:假设JVM参数-Xss设置为1m,如果某个方法里面创建一个128kb的数组,那这个方法在同一个线程中只能递归4次,再递归第五次的时候就会报StackOverflowException异常,因为虚拟机栈的大小只有1m,每次递归都需要为方法在虚拟机栈中分配128kb的空间,很显示到第五次的时候就空间不足了。
程序计数器
程序计数器是一个记录着当前线程所执行的字节码的行号指示器。JVM的多线程是通过CPU时间片轮转(即线程轮流切换并分配处理器执行时间)算法来实现的。也就是说,某个线程在执行过程中可能会因为时间片耗尽而被挂起,而另一个线程获取到时间片开始执行。
简单的说程序计数器的主要功能就是记录着当前线程所执行的字节码的行号指示器。
方法区(元数据区)
方法区存储了类的元数据信息、静态变量、常量等数据。