资料内容:
对象在哪块内存分配?
数组和对象在堆内存分配;某些对象没有逃逸出方法,可能被优化为在栈上分配
谈谈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中注册的回调、本地代码缓存等。