JVM垃圾回收相关概念

本文深入探讨Java中的垃圾回收机制,包括System.gc()的作用及其带来的FullGC过程,解释了内存溢出与内存泄漏的区别,以及垃圾回收中的并行与并发概念。此外还介绍了安全点与安全区域的概念,并详细说明了不同类型的引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

System.gc()的理解
  • 在默认情况下,通过System.gc()或者Runtime.getRuntime.gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存
  • 然后System.gc()调用附带一个免责声明,无法保证堆垃圾收集器的调用
  • JVM实现者可以通过System.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该自动进行,无需手动触发,否则太过麻烦。在一谢特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。
内存溢出与内存泄漏
内存溢出OOM

没有空闲内存,并且垃圾收集器也无法提供更多内存
原因:

  1. Java虚拟机的堆内存设置不够
    比如:可能存在内存泄漏问题;也可能时堆的大小设计不合理,比如我们要处理比较可观的数据量,但是没有显式指定JVM堆的大小或者指定数值偏小,可以通过参数-Xmx、Xmx来调整。
  2. 代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)
内存泄漏

严格来讲,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。
但实际情况中很多时候一些不太好的实践(疏忽)会导致对象的生命周期变得很长,甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”。

Stop The World

Stop The World简称STW,指的是GC过程中会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿成为STW。

垃圾回收的并行与并发
  • 并发:多个事情,在一个时间段内同时发生,互相抢占资源。
  • 并行:多个事情,在一个时间点上同时发生,互相不抢占资源。
安全点与安全区域
  • 安全点:程序执行中并非在所有地方都可以停顿下来开始GC,只有在特定的位置才可以停顿下来进行GC,这些位置被称为“安全点”(safepoint)
    安全点的选择很重要,如果太少可能导致程序GC等待时间太长,如果太多可能导致程序运行时的性能问题。大部分指令的执行时间都是很短暂的,通常回根据“是否具有让程序长时间执行的特征”为标准。如方法调用,循环跳转,异常跳转等
  • 安全区域:安全区域是指在一段代码中,对象的引用关系不会发生变化,在这个区域中的任意位置开始GC都是安全的。我们也可以把Safe Reginon看作是被扩展的Safepoint。
引用
  • 强引用(StrongReference):最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj = new Object()”这种引用关系。
  • 软引用(SoftReference):在系统将要发生内存溢出之前,将会把这些对象列入回收范围中进行第二次回收。如果这次回收后还没有足够的内存,才会OOM。
  • 弱引用(WeakReference):被弱引用关联的对象只能生存到下一次垃圾回收之前。当垃圾回收器工作时,不论内存空间是否足够,都进行回收。
  • 虚引用(PhantomReference):一个对象是否又虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用获取一个对象实例。为对象设置一个虚引用的唯一目的就是能够在这个对象被回收器回收时收到一个系统通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值