# JVM
author: “\U0001F336 辣椒炒饭”
date: 2023-03-23 23:06:05
tags:


# 内存模型以及分区,需要详细导每个区放什么。

JVM 分为堆区和栈区,方法区。

  1. 方法区:主要是存储类的信息,常量池里的变量和常量(static 常量和 static 变量),还有编译后的代码。
  2. 堆:初始化的对象,成员变量(那种非 static 的变量),所有的对象实例和数组都要在堆上分配。
  3. 栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部标量表存放的是 8 大基础类型加上一个应用类型,所以还是一个指向地址的指针。
    本地方法栈:主要为 Nativate 方法服务。


    程序计数器:记录当前线程执行的行号。

# 简述 Java 垃圾回收机制。

在 Java 中,程序员不用自己去释放每一个对象的内存。而是让虚拟机自己去释放。在 JVM 中,有一个垃圾回收机制,它是低优先级,也就是说正常情况下不会执行自己,只有在虚拟机空闲的时候或者当前堆内存不够时,才会触发执行,把那些没有被引用的对象,添加到需要回收的集合中,并进行回收。

# 常用的垃圾回收算法和垃圾回收器

  1. 标记 - 清除算法(Mark and Sweep Algorithm)
  2. 复制算法(Copying Algorithm)
  3. 标记 - 整理算法(Mark and Compact Algorithm)

标记 - 清除算法:先标记所有活动对象,再清除未标记对象。标记过程可能会中断程序运行,且清除之后会产生内存碎片,降低空间利用率。

复制算法:将堆内存分为两个区域,每次只使用其中一个区域,当这个区域满了之后将存活的对象复制到另一个区域中,并将原来的区域全部回收。该算法不会产生内存碎片,但浪费一半的内存空间。

标记 - 整理算法:先标记所有活动对象,然后将它们向一端移动,最后清除边界之外的内存空间。相比标记 - 清除算法,标记 - 整理算法可以提高空间利用率,但需要移动对象,会影响程序运行速度。

综上所述,三种算法各有优缺点,具体选用哪种算法取决于应用场景和需求。

#