八股训练营第 37 天 | Java 内存区域有哪些部分?介绍一下什么是强引用、软引用、弱引用、虚引用?有哪些垃圾回收算法?有哪些垃圾回收器?

Java 内存区域有哪些部分?

主要分为程序计数器、Java 虚拟机栈、本地方法栈、堆、方法区。其中前三个是线程私有的,后两个是线程共享的。

  1. 程序计数器:用于保存当前线程正在执行的字节码指令的地址
  2. Java 虚拟机栈:是线程私有的。每个方法都会在运行时创建一个栈帧,用于保存局部变量、操作数栈、动态链接、返回地址等。栈帧在方法调用时入栈,在方法返回时出栈。
  3. 本地方法栈:和 JVM 栈类似。但是为本地方法提供服务。由其他编程语言(C/C++)编写。
  4. 堆:最大的一块内存区域。用于保存的对象实例和数组。堆是被所有线程共享的一块内存区域。
  5. 方法区/元空间:用于保存类信息、静态变量、常量等。

介绍一下什么是强引用、软引用、弱引用、虚引用?

  1. 强引用:强引用是最常见、默认的引用类型。强引用的对象无论何时都不会被垃圾回收。
  2. 软引用:软引用用于描述那些可能有用但非必须的对象。如果一个对象只有软引用指向它。那么当内存不足时。垃圾回收器会尝试回收这些对象。软引用通常用于实现缓存,可以在内存不足时释放缓存中的对象。
  3. 弱引用:弱引用的生命周期比软引用更短暂。如果一个对象只有弱引用指向它。那么下次垃圾回收时,这些对象一定会被回收。弱引用通常用于实现对象缓存,但不希望缓存的对象影响垃圾回收的情况。
  4. 虚引用:虚引用是 Java 中最弱的引用类型。如果一个对象只有虚引用指向它。那么无论何时都可能被垃圾回收器回收。但在对象被回收之前,虚引用会被放在一个队列中,供程序员处理。虚引用主要用于跟踪对象被垃圾回收的时机。以便进行清理和记录

有哪些垃圾回收算法?

  1. 标记 - 清除算法:适用于老年代。分为两个阶段:标记阶段和清理阶段。标记阶段会从 GC Roots 出发。标记出所有的存活对象。未被标记的对象就是将要回收的对象。清除阶段就会清除掉所有未被标记的对象。
    它的优点是:实现简单。
    缺点是:会产生内存碎片。可能导致后续无法分配大对象。
  2. 标记 - 整理算法:适用与老年代。是标记 - 清除算法的优化。用于解决内存碎片的问题。它首先也是标记出所有存活对象。然后将这些存活对象全部移动到一端。再将边界外的空间全部清理掉。
    它的优点是:不会产生内存碎片。
    缺点是:移动对象的开销较大。
  3. 复制算法:适用于新生代。将内存分为两块区域。将标记的存活对象全部复制到另一块内存中去。然后清空之前的内存。
    它的优点是:无内存碎片。分配速度快。
    缺点是:会浪费一半的内存。
  4. 分代收集算法:虚拟机默认使用的回收算法。将内存分为新生代和老年代。新生代存活率低,使用复制算法。老年代存活率高,使用标记 - 清除和标记 - 整理算法。

有哪些垃圾回收器?

JVMJava拟机)在Java八股文中常考的内容主要有以下几个方面: ### 内存结构 JVM的内存结构包括程序计数器、拟机栈、本地方法栈、堆和方法区。程序计数器是当前线程所执行的字节码的行号指示器;拟机栈每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息;本地方法栈与拟机栈类似,只不过服务的对象是本地方法;堆是JVM中最大的一块内存区域,所有的对象实例和数组都在这里分配内存;方法区用于存储已被拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。例如: ```java public class MemoryExample { // 静态变量存放在方法区 static int staticVar = 0; public static void main(String[] args) { // 局部变量存放在拟机栈 int localVar = 1; // 对象实例存放在堆 Object obj = new Object(); } } ``` ### 类加载机制 类加载过程包括加载、验证、准备、解析和初始化五个阶段。加载是将类的字节码文件加载到内存中;验证确保被加载类的正确性;准备为类的静态变量分配内存并设置默认初始值;解析将常量池内的符号引用替换为直接引用;初始化是执行类构造器`<clinit>()`方法的过程。类加载器有启动类加载器、扩展类加载器和应用程序类加载器,它们之间遵循双亲委派模型,即一个类加载器收到类加载请求后,先将请求委派给父类加载器去完成,只有父类加载器无法完成时,自己才去加载。例如: ```java public class ClassLoadingExample { static { System.out.println("Class is being initialized."); } public static void main(String[] args) { // 触发类的初始化 new ClassLoadingExample(); } } ``` ### 垃圾回收机制 垃圾回收主要关注堆和方法区的内存回收。判断对象是否存活的算法引用计数算法和可达性分析算法。可达性分析算法通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。常见的垃圾回收算法有标记 - 清除算法、标记 - 整理算法、复制算法和分代收集算法。不同的垃圾回收器实现了不同的垃圾回收算法,如Serial、ParNew、Parallel Scavenge、CMS、G1等。例如: ```java public class GarbageCollectionExample { public static void main(String[] args) { Object obj1 = new Object(); Object obj2 = new Object(); // 让obj1不再引用对象,该对象可能会被垃圾回收 obj1 = null; // 手动触发垃圾回收(不一定立即执行) System.gc(); } } ``` ### 性能调优 JVM性能调优主要是通过调整JVM的参数来优化内存使用和垃圾回收效率。例如,通过调整堆的大小(`-Xms`和`-Xmx`)来避免频繁的垃圾回收;通过选择合适的垃圾回收器来提高应用程序的性能。例如: ``` java -Xms512m -Xmx1024m -XX:+UseG1GC MainClass ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值