失效链接处理 |
2024 JVM面试题及答案-共50道 下载
相关截图:
主要内容: 对象在哪块内存分配? 数组和对象在堆内存分配;某些对象没有逃逸出方法,可能被优化为在栈上分配 谈谈JVM中的常量池 JDK 1.8开始 1、字符串常量池:存放在堆中,包括String对象执行intern()方法后存的地方、双引号直接引用的字符串 2、运行时常量池:存放在方法区,属于元空间,是类加载后的一些存储区域,大多数是类中 constant_pool 的内容 3、类文件常量池: constant pool,JVM定义的概念 谈谈动态年龄判断 1、这里涉及到-XX:TargetSurvivorRatio 参数,Survivor区的目标使用率默认50,即Survivor区对象目标使用率为50%。 2、Survivor区相同年龄所有对象大小的总和(Survivor区内存大小*这个目标使用率)时,大于或等于该年龄的对象直接进入老年代。 3、当然,这里还需要考虑参数-XX:MaxTenuringThreshold 晋升年龄最大阈值 谈谈永久代 1、JDK8之前,Hotspot中方法区的实现是永久代(Perm) 2、JDK7开始把原本放在永久代的字符串常量池、静态变量等移出到堆,JDK8开始去除永久代,使用元空间(Metaspace),永久代剩余内容移至元空间,元空间直接在本地内存分配。 JVM有哪些运行时内存区域? Java 8 1、The pc Register,程序计数器 2. Java Virtual Machine Stacks,Java 虚拟机栈 3、Heap,堆 4 Method Area,方法区 5、Run-Time Constant Pool,运行时常量池 6、Native Method Stacks,本地方法栈 运行时栈帧包含哪些结构? 1、局部变量表 2、操作数栈 3、动态连接 4、返回地址 5、附加信息 JVM 的内存模型是什么? JVM试图定义一种统一的内存模型,能将各种底层硬件以及操作系统的内存访问差异进行封装,使Java程序在不同硬件以及操作系统上都能达到相同的并发效果。它分为工作内存和主内存,线程无法对主存储器直接进行操作,如果一个线程要和另外一个线程通信,那么只能通过主存进行交换。 JVM 如何确定垃圾对象? 1、JVM采用的是可达性分析算法,通过GC Roots来判定对象是否存活,从GC Roots向下追溯、搜索,会产生Reference Chain。当一个对象不能和任何一个GC Root产生关系时,就判定为垃圾。 2、软引用和弱引用,也会影响对象的回收。内存不足时会回收软引用对象;GC 时会回收弱引用对象。 哪些是GC Roots? 1、在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。 2、在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。 3、在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。 4、在本地方法栈中JNI(即通常所说的Native方法)引用的对象。 5、Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。 6、所有被同步锁(synchronized关键字)持有的对象。 7、反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。 |