07、垃圾回收

  • GC 是什么:自动内存回收机制。
  • 能否调用:可以调用(如 System.gc()),但本质是建议,且需权衡性能风险。
  • 最佳实践:信任 JVM 的自动管理,优先优化代码逻辑和 JVM 参数(如:选择合适的 GC 算法)。

1、程序员能否主动调用垃圾回收器?


可以,但需谨慎
  1. 调用方式
    • 在 Java 中,可通过 System.gc() 或 Runtime.getRuntime().gc() 。
      • System.gc() 内部直接用的 Runtime.getRuntime().gc() 。
    • 向 JVM 建议 触发垃圾回收。
    • 在 C# 中,使用 GC.Collect() 方法。
  2. 关键注意事项
    • 建议而非强制
      • 调用 System.gc() 仅向 JVM 发送请求,不保证立即执行,具体行为由 JVM 决定
    • 性能风险
      • 强制触发 Full GC 可能导致 Stop-The-World(STW) 暂停。
      • 阻塞应用线程,影响性能。
    • 破坏 JVM 优化
      • JVM 的垃圾回收策略(如分代回收、动态调整频率)可能被干扰。
      • 导致内存管理效率降低。
  3. 实际开发中的建议
    • 避免手动调用:99% 的场景应依赖 JVM 的自动管理,手动调用通常弊大于利。
    • 特殊场景:仅在调试、性能测试或处理堆外内存(如: DirectByteBuffer)时谨慎使用。
    • 生产环境禁用:可通过 JVM 参数 -XX:+DisableExplicitGC 禁止显式调用 GC。

2、为什么程序员不应依赖手动 GC?


  1. JVM 更智能
    • JVM 会根据内存使用情况和 GC 算法(如:G1、ZGC)自动选择****最佳回收时机
    • 无需人工干预。
  2. 不可预测性
    • 不同 JVM 实现(如:HotSpot、OpenJ9)对 System.gc() 的响应策略不同。
    • 因此,代码行为可能不一致。
  3. 替代优化方案
    • 减少对象创建:复用对象(如:对象池)、避免不必要的临时对象。
    • 及时释放资源:关闭文件流、数据库连接等(用 try-with-resources)。
    • 合理使用****引用类型:软引用(SoftReference)、弱引用(WeakReference)辅助内存管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值