JAVA虚拟机相关面试题
尚硅谷Java大厂面试题第二季(java面试必学,周阳主讲)
类加载子系统
运行时数据区
程序计数器
JVM虚拟机栈
栈帧
- 操作数栈
- 局部变量表
- 动态链接
- 方法返回地址
- 附加信息
JVM:栈式虚拟机;零地址指令,更加紧凑;进出栈更加频繁(栈顶缓存技术ToS),指令更多
区别于寄存器虚拟机(多地址,指令更少,执行速度快)
面试题
++i和i++的区别;字节码角度
第一类问题相同
举例栈溢出的情况
- *Error
- 不断加栈帧 ,栈大小固定的情况下栈大小不足,-Xss设置
- OOM
- 栈大小动态变化,内存不够分配时
调整栈的大小不能保证不溢出(增大只能使其出现时间更晚一些,不能保证不会出现)
分配的占内存越大越好吗? 单位时间内发生溢出概率变小;内存空间有限,某线程栈大小过大,可能挤占其他线程以及堆等空间
垃圾回收是否涉及虚拟机栈?不!
方法中定义的局部变量是否局部安全?具体问题具体分析
线程安全:如果只有一个线程可以操作此数据,则必然是线程安全;(内部产生内部消亡)
如果多个线程操作此数据,则此数据是共享数据;如果不考虑同步机制,则会存在。
发生逃逸
s1在线程内部消亡了,不会被返回给其他调用
本地方法接口
本地方法栈
堆空间
堆的核心概述
进程对应一个JVM实例,一个JVM实例对应一个Runtime(单例),有一个运行时数据区
一个JVM实例只有一个堆内存,JAVA堆区在JVM启动时就被创建,其空间大小也被确定。
设置堆内存大小与OOM
初始-Xms
最大-Xmx
OOM:发生在老年代(FullGC/Major GC后)
年轻代与老年代
伊甸园区
幸存者0区
幸存者1区
老年代
老:年轻=2:1
Eden:s0:s1=8:1:1
图解对象分配的过程
Minor GC Major GC Full GC
堆空间分代思想
内存分配策略
为对象分配内存:TLAB
堆是分配对象的唯一选择吗
逃逸分析
代码优化
方法区
=
区子系统