JVM内存区域

###看了好多面经,感觉还是要看书,然后自己整理一下,于是决定看深入理解java虚拟机这本书###
####Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里 面的人却想出来。####

1.JVM内存区域分为五大部分:

虚拟机栈

java线程的栈帧,线程的每一个方法会生成一个栈帧,用于存放该线程的局部变量表、操作数栈、动态连接、方法出口等信息。随着方法的调用与结束,对应着入栈与出栈;局部变量表中存放着方法参数和内部定义的局部变量,基本存储单位是方法槽。
动态连接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,这个引用是为了支持方法调用过程中的动态连接(DynamicLinking) 这些符号引用一部分会在类加载阶段或者第一次使用的时候就被转化为直接引用,这种转化被称为静态解析 另外一部分符号引用将在每一次运行期间都转化为直接引用,这部分就称为动态连接
操作数栈:java虚拟机栈中的一个用于计算的临时数据存储区

本地方法栈 Native方法的栈帧 和虚拟机栈差不多,只不过是调用ni方法的栈帧
堆 几乎所有的对象都在这里分配内存

​ 堆分为老年代、新生代、永久代;

​ 新生代分为Eden FromSurvivors To Survivors 8:1:1

​ 这两个Survivors有什么用呢?

​ 在分配内存时,每次只使用一块Eden和 Survivor然后使用标记复制算法将其复制到另一块Survivor上。当Survivor空间不足以容纳一次Minor GC之后存活的对象时,就需要依赖其他内存区域(实 际上大多就是老年代)进行分配担保(Handle Promotion)。

方法区 :

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载 的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

程序计数器:

当前线程字节码文件的行号指示器,通过改变该计数器的值来获得下一步执行的字节码指令;程序控制流的指示器,程序当中的分支、循环、线程恢复、跳转、异常处理都要由它指示。由于Java虚拟机通过时间片轮转实现多线程,所以每一个线程都需要一个程序计数器记录当前执行的位置。

2.Java对象的创建过程:(每一步详细实现)

​ 检查类是否加载

​ 分配内存,在堆中分配内存

​ 初始化 为变量赋默认值

​ 设置对象头

​ 执行init

3.对象访问定位的方式:

​ 句柄池:每一个句柄 数据结构中包括对象数据的指针以及类的指针

​ 直接指针 在对象数据中存放类指针

4.JVM内存分配与回收:

​ 大对象直接放在老年代

​ 对象有限在eden分配

​ 长期存活的对象进入老年代

5堆内存中对象分配的基本策略:2种

​ 碰撞指针、空闲表

并发问题如何解决

CAS乐观锁+失败重试 先创建失败了就重试

TLAB 为每个线程在Eden初设一点内存,现在TLAB分配 当TLAB用完后,用CAS+失败重试

6.如何判断对象是否死亡:

​ 如果没有任何一个对象引用该对象则判断为死亡(可达性方法)

​ (引用计数法)没引用一次加一取消引用减一;不好解决互相引用的问题;

GCRoots有哪些?

​ 虚拟机栈中引用的对象,本地方法栈中引用的对象

​ 方法区中常量引用的对象,方法区中类静态属性引用的对象

7.如何判断常量是否无用,类是否无用?

​ 常量无用:没有引用即可

​ 类无用:该Class类没有被引用、没有该类的对象还在存活、该类的ClassLoader已经销毁

8.GC的算法有哪些?3种

​ 标记-清除 (可以标记被清除的,也可以标记不被清除的)造成空间破碎

​ 标记 复制 (可利用空间减半)

​ 标记 整理 老年代专用

9.常见的垃圾回收器

​ 七个收集器(三个新生代 三个老年代 G1通吃)

image-20210307141614043

G1跳出了这个樊笼,它可以面向堆内存任 何部分来组成回收集(Collection Set,一般简称CSet)进行回收,衡量标准不再是它属于哪个分代,而 是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式

G1开创的基于Region的堆内存布局是它能够实现这个目标的关键。虽然G1也仍是遵循分代收集理 论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的 分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的 Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的 旧对象都能获取很好的收集效果。

两个支持低延迟垃圾收集器(ZGC 、 Sh。。。)以把垃圾收集的停顿时间限制在十毫秒以内的低延迟

image-20210307142929097

10.HotSpot虚拟机实现:

根节点枚举、安全点、写屏障