Java中的GC机制

GC是垃圾收集器(Garbage Collection),自动管理内存的回收,Java 程序员不用担心内存管理。

Java是由C++发展来的。

在C/C++中,释放无用变量内存空间的事情要由程序员自己来解决。就是说当程序员认为变量没用了,就应当写一条代码,释放它占用的内存。这样才能最大程度地避免内存泄露和资源浪费。这样显然是非常繁琐的。况且程序比较大,变量多的时候,程序员往往会忘记释放内存或者在不该释放的时候释放内存了。

在Java中,有了GC的存在,就不需要程序员去人工释放内存空间。当Java虚拟机发觉内存资源紧张的时候,就会自动地去清理无用变量所占用的内存空间。
当然,如果需要,程序员可以在Java程序中显式地使用System.gc()来强制进行一次立即的内存清理。但是调用System.gc()只是给虚拟机一个建议,不一定会执行,因为System.gc()是在一个优先级很低的线程中执行。

JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,需要GC的内存区域主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。
在这里插入图片描述

Java的内存管理就是对象的分配和释放问题。内存的分配是由程序完成的,而内存的释放是有GC完成的。

理解GC的工作原理,如下图,在这个有向图中,main为根顶点,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。在这里插入图片描述
Java中的内存泄露条件
首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。

什么时候触发GC
(1)程序调用System.gc时可以触发
(2)系统自身来决定GC触发的时机(根据Eden区和From Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值