0
点赞
收藏
分享

微信扫一扫

java垃圾回收

小铺有酒一两不够 2022-04-03 阅读 22
java

java垃圾回收

内存溢出异常

java中内存泄漏场景

内存泄漏是指不再被使用的对象或变量一直被占据在内存中,理论上说java中石油GC垃圾回收机制的,也就是说,不再被使用的对象会被GC自动回收掉,自动从内存中清除
但是,即使是这样,java也还是存在着内存泄漏的情况,java导致内存泄漏的原因很明确,,尽管短生命周期对象已经不再需要,但因为长生命周期对象持有它的引用而导致不能被回收,这就是java总的内存泄漏的发生场景。

垃圾回收

java中垃圾回收机制

在java中,程序员是不需要显式的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常的情况下是不对执行的,只有在虚拟机空闲或当前堆内存不足时才会触发执行,扫描那些没有被引用的对象,并将它们添加到要被回收的集合中,进行回收。

GC是什么?为什么要GC

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

垃圾回收的优点和原理

java语言最显著的特点就是引入了垃圾回收机制,它使java程序员在编写程序时不再考虑内存管理的问题。
由于有这个垃圾回收机制。java中的对象不再有“作用域”的概念,只有引用的对象才有“作用域”。
垃圾回收机制有效的防止了内存泄漏,可以有效的使用可使用的内存。
垃圾回收器通常作为一个单独的低级别的线程执行,在不可预知的情况下对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。
程序员不能实时的对某个对象或者所有对象调用垃圾回收器进行垃圾回收。

常见的垃圾回收机制

  • 分代复制垃圾回收
  • 标记垃圾回收
  • 增量垃圾回收

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

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

java 中都有哪些引用类型

  • 强引用:发生gc时候不会被回收
  • 软引用:有用但不是必须的对象,在发生内存溢出之前会被回收
  • 弱引用:有用但不是必须的对象,在下一次GC时会被回收。
  • 虚引用(幽灵引用/幻影引用):无法通过虚拟引用获得对象,用PhantomReference 实现虚拟引用,虚拟引用的用途是在gc时返回的一个通知。

怎么判断对象是否可以被回收?

垃圾回收器在做垃圾回收的时候,首先需要判断的就是哪些内存时需要被回收的,哪些对象是存活的,是不可以被回收的
一般有两种方法来判断:

  • 引用计数法:为每个对象创建一个引用计数,有对象引用时计数器加一,引用被释放减一,当计数器为0时就可以被回收,他有一个缺点即时不能解决循环引用的问题
  • 可达性分析算法:从GC Roots 开始向下检索,搜索所走过的路=路径为引用链。当一个对象到GC Roots没有任何引用链相连时则证明此对象是可以被回收的。

在java中对象什么时候可以被垃圾回收

当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。

JVM 中的永久代会发生垃圾回收吗

垃圾回收不会发生在永久代,如果永久代满了或者超过了临界值,会触发完全垃圾回收(FULL GC)。如果仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的,这就是为什么正确的永久代大小对避免FULL GC 是非常重要的原因。
ps:java 8 已经移除了永久代,新加了一个元数据区的native内存区。

举报

相关推荐

0 条评论