有关垃圾回收的面试题

77、GC是什么? 为什么要有GC?   

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

78、垃圾回收的优点和原理。并考虑2种回收机制。

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不用实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

 

79、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

### Java 垃圾回收机制面试题及解答 #### 什么是垃圾回收垃圾回收(Garbage Collection, GC)是指自动管理内存的过程,它能够识别并释放不再使用的对象所占用的内存空间。这种方式可以有效防止内存泄漏和提高程序性能[^1]。 #### finalize() 方法的作用是什么?它的局限性有哪些? `finalize()` 是 Object 类中的一个受保护的方法,在子类中可以通过重写此方法来定义当某个对象即将被垃圾收集器回收之前要执行的操作。然而,不建议依赖 `finalize()` 来实现资源清理逻辑,因为其行为不可预测且效率低下: - 不保证及时调用; - 可能引发性能问; - 存在安全风险; - 并不是所有平台都支持该特性; 推荐的做法是在不需要的对象上显式关闭或释放资源而不是等待 JVM 自动处理。 #### 如何触发一次完整的 Full GC? 通常情况下应用程序无需手动干预GC过程,但在某些特殊场景下可能需要强制进行完全清扫操作。这可以通过以下几种方式之一完成: - 调用 System.gc(), Runtime.getRuntime().gc(); - 使用命令行参数 `-XX:+ExplicitGCInvokesConcurrent` 和 `-XX:+UseGCLockerInvokingConcurently`; - 设置环境变量 `_JAVA_OPTIONS=-XX:+UnlockDiagnosticVMOptions -XX:+UnsyncThreadDumpOnFullGC`; 需要注意的是这些手段并不能确保立即发生full gc事件,具体取决于当前采用哪种算法以及系统状态等因素影响. #### 列举常见的几款JVM垃圾收集器及其优缺点对比分析. | 收集器名称 | 主要优点 | 缺点 | | --- | --- | --- | | Serial Collector (串行) | 占用较少CPU核心数;适合单核处理器设备上的小型应用 | 对多线程/高并发的应用表现不佳| | Parallel Scavenge / Throughput Collector (吞吐量优先)| 提供较高的吞吐率;适用于后台批处理任务 | 较高的暂停时间可能导致用户体验下降 | | CMS (Concurrent Mark-Sweep) collector | 减少停顿时间;更适合交互型Web服务端程序 | 需要更多堆外内存;容易产生浮动垃圾 | | G1 Garbage First Collector | 实现区域化管理和混合整理策略;兼顾低延迟与高效能之间的平衡 | 复杂度较高;配置不当可能会引起性能瓶颈 | 每种类型的收集器都有各自的特点,选择合适的方案需考虑实际业务需求和技术架构特点. ```java // 示例代码展示如何设置不同的垃圾收集器选项 public class Main { public static void main(String[] args){ // 启用ParallelScavenge收集器 java.lang.management.ManagementFactory.getMemoryMXBean(). setVerbose(true); // 或者通过启动参数指定其他类型如CMS,G1等... //-XX:+UseParNewGC -XX:+UseConcMarkSweepGC ... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值