system.gc()方法的使用

Aria_zuo 2012-04-18 02:23:03
在程序中频繁的手动调用是否会反而导致内存的使用量变大?从而导致系统当机?
比如对一个视频进行循环播放,在每次播放完毕后进行一次手动调用system.gc(),然后在进行从新播放,这样会对程序有影响吗?谁能帮帮忙~
...全文
5990 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yu羽木凌风 2013-09-04
  • 打赏
  • 举报
回复
system.gc()只是建议jvm回收垃圾,但决定权还是在JVM手里,由她决定是否现在要回收垃圾。
神奇物种 2013-05-05
  • 打赏
  • 举报
回复
static int i = 1; public RubbishRelease() { System.out.println(i++); } public void finalize() { System.out.println("finalize..."); } public static void main(String[] args) { for (int i = 0; i < 100000; i++) { new RubbishRelease(); new RubbishRelease(); new RubbishRelease(); System.gc(); } System.out.println("over!"); } 试试这个~比较下速度,非常明显,所以gc还是不能随便适用嘀~
神奇物种 2013-05-05
  • 打赏
  • 举报
回复
嗯,ls说得很好~
ziyuetian 2012-07-02
  • 打赏
  • 举报
回复
做过一个 试验,不一定准确,在一个并发比较高的程序中,每次线程结束都调用一下System.gc(),结果内存下来了,原来会上升到300M左右会被JVM给清理掉,现在会稳定在30M左右,但CPU由由原来的1.5%左右上升到了6%左右,跟踪了一下线程,发现会有好多堆栈跟踪的线程在频繁启动,所以个人感觉频繁调用System.gc()对资源还有一定消耗的。
feihumingyue 2012-04-18
  • 打赏
  • 举报
回复
会有影响吧。你想想,一直催着jvm做事,搞不好它忙不过来而且又是相同的资源,可能很消耗内存
Aria_zuo 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
这个就像你在饭店吃饭,你点好了菜,菜按顺序上的,你调了system.gc(),厨师看你催的急给你插个队,所以说不定要看CPU有没有调度时间给你。
[/Quote]那也就是说,手动调用system.gc()还是会起作用的。那么如果频繁调用,如1分钟调用一次,当一个线程执行完一次,调用一次,是否会导致内存的使用反而增加?大家回复了这么多,我还是没有弄明白是否会内存有影响?会不会导致系统当机?
jiakai0419 2012-04-18
  • 打赏
  • 举报
回复
我也看过一点,jvm方面的书。

我猜测可能是这样的。

有很多因素都会导致 jvm 进行垃圾回收。

但是因素分为两种类型
一种是触发型。

这就好比你新new 一个对象,jvm发现eden区(你可以理解为堆中的某块区域)空间不够了。

这个时候,jvm就会进行一次minorGC(你可以理解为一种垃圾回收程序)。

一种是检查型。

比如你虚拟机参数为

当老年代(你可以理解为堆中的某块区域)中内存使用率达到了68%的时候就进行一次majorGC(你可以理解为一种垃圾回收程序)。


对于触发型,是不得不gc的。
而对于检查型,相当于一个线程,每隔一段时间就执行某段程序检查看需不需要gc.


而System.gc()。就是建议虚拟机检查一下需不需要gc(也就是上面那个线程,每隔一段时间执行的那个程序).


也就是说本来是30s之后看需不需要gc,而你在此时此刻就让他看需不需要gc.


这是个人猜测,不一定对。
jiakai0419 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

恩 是的.JVM回收垃圾是其内部判断是否应该进行垃圾回收。而不受外部支配
既然如此,那为什么有的程序中还是会手动添加GC了?
[/Quote]

问的好。
  • 打赏
  • 举报
回复
这个就像你在饭店吃饭,你点好了菜,菜按顺序上的,你调了system.gc(),厨师看你催的急给你插个队,所以说不定要看CPU有没有调度时间给你。
Aria_zuo 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

恩 是的.JVM回收垃圾是其内部判断是否应该进行垃圾回收。而不受外部支配
[/Quote]既然如此,那为什么有的程序中还是会手动添加GC了?
安特矮油 2012-04-18
  • 打赏
  • 举报
回复
恩 是的.JVM回收垃圾是其内部判断是否应该进行垃圾回收。而不受外部支配
Aria_zuo 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

Sysytem.gc();只是告诉JVM垃圾回收,但是至于JVM是否会回收是没办法控制的。所以你调用不调用gc对系统来说没有太大的影响。
[/Quote]也就是说,果然程序的频繁调用GC,但是JVM没有到达要求,也不会去执行,虽然手动要求执行,但是系统内部还是要由JVM决定是吗?
a190169583 2012-04-18
  • 打赏
  • 举报
回复
有吧,就比如一个系统,你登陆后用map保存一些你需要的临时数据,退出的时候必须用system.gc()进行摧毁,当然如果很久不用map里面的键值对就可以不用system.gc()了,jvm会自动清除的。
ZZZ5512536 2012-04-18
  • 打赏
  • 举报
回复
Sysytem.gc(); 这个只是通知JVM进行垃圾回收,但JVM具体什么时候回收是程序员无法控制的。
安特矮油 2012-04-18
  • 打赏
  • 举报
回复
Sysytem.gc();只是告诉JVM垃圾回收,但是至于JVM是否会回收是没办法控制的。所以你调用不调用gc对系统来说没有太大的影响。

62,610

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧