Java 内存区域有哪些部分?
主要分为程序计数器、Java 虚拟机栈、本地方法栈、堆、方法区。其中前三个是线程私有的,后两个是线程共享的。
- 程序计数器:用于保存当前线程正在执行的字节码指令的地址
- Java 虚拟机栈:是线程私有的。每个方法都会在运行时创建一个栈帧,用于保存局部变量、操作数栈、动态链接、返回地址等。栈帧在方法调用时入栈,在方法返回时出栈。
- 本地方法栈:和 JVM 栈类似。但是为本地方法提供服务。由其他编程语言(C/C++)编写。
- 堆:最大的一块内存区域。用于保存的对象实例和数组。堆是被所有线程共享的一块内存区域。
- 方法区/元空间:用于保存类信息、静态变量、常量等。
介绍一下什么是强引用、软引用、弱引用、虚引用?
- 强引用:强引用是最常见、默认的引用类型。强引用的对象无论何时都不会被垃圾回收。
- 软引用:软引用用于描述那些可能有用但非必须的对象。如果一个对象只有软引用指向它。那么当内存不足时。垃圾回收器会尝试回收这些对象。软引用通常用于实现缓存,可以在内存不足时释放缓存中的对象。
- 弱引用:弱引用的生命周期比软引用更短暂。如果一个对象只有弱引用指向它。那么下次垃圾回收时,这些对象一定会被回收。弱引用通常用于实现对象缓存,但不希望缓存的对象影响垃圾回收的情况。
- 虚引用:虚引用是 Java 中最弱的引用类型。如果一个对象只有虚引用指向它。那么无论何时都可能被垃圾回收器回收。但在对象被回收之前,虚引用会被放在一个队列中,供程序员处理。虚引用主要用于跟踪对象被垃圾回收的时机。以便进行清理和记录
有哪些垃圾回收算法?
- 标记 - 清除算法:适用于老年代。分为两个阶段:标记阶段和清理阶段。标记阶段会从 GC Roots 出发。标记出所有的存活对象。未被标记的对象就是将要回收的对象。清除阶段就会清除掉所有未被标记的对象。
它的优点是:实现简单。
缺点是:会产生内存碎片。可能导致后续无法分配大对象。 - 标记 - 整理算法:适用与老年代。是标记 - 清除算法的优化。用于解决内存碎片的问题。它首先也是标记出所有存活对象。然后将这些存活对象全部移动到一端。再将边界外的空间全部清理掉。
它的优点是:不会产生内存碎片。
缺点是:移动对象的开销较大。 - 复制算法:适用于新生代。将内存分为两块区域。将标记的存活对象全部复制到另一块内存中去。然后清空之前的内存。
它的优点是:无内存碎片。分配速度快。
缺点是:会浪费一半的内存。 - 分代收集算法:虚拟机默认使用的回收算法。将内存分为新生代和老年代。新生代存活率低,使用复制算法。老年代存活率高,使用标记 - 清除和标记 - 整理算法。
1370

被折叠的 条评论
为什么被折叠?



