system.gc()方法的使用

时间:2021-04-09 03:43:11
在程序中频繁的手动调用是否会反而导致内存的使用量变大?从而导致系统当机?
比如对一个视频进行循环播放,在每次播放完毕后进行一次手动调用system.gc(),然后在进行从新播放,这样会对程序有影响吗?谁能帮帮忙~

15 个解决方案

#1


Sysytem.gc();只是告诉JVM垃圾回收,但是至于JVM是否会回收是没办法控制的。所以你调用不调用gc对系统来说没有太大的影响。

#2


Sysytem.gc(); 这个只是通知JVM进行垃圾回收,但JVM具体什么时候回收是程序员无法控制的。

#3


有吧,就比如一个系统,你登陆后用map保存一些你需要的临时数据,退出的时候必须用system.gc()进行摧毁,当然如果很久不用map里面的键值对就可以不用system.gc()了,jvm会自动清除的。

#4


引用 1 楼  的回复:
Sysytem.gc();只是告诉JVM垃圾回收,但是至于JVM是否会回收是没办法控制的。所以你调用不调用gc对系统来说没有太大的影响。
也就是说,果然程序的频繁调用GC,但是JVM没有到达要求,也不会去执行,虽然手动要求执行,但是系统内部还是要由JVM决定是吗?

#5


恩  是的.JVM回收垃圾是其内部判断是否应该进行垃圾回收。而不受外部支配

#6


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

#7


这个就像你在饭店吃饭,你点好了菜,菜按顺序上的,你调了system.gc(),厨师看你催的急给你插个队,所以说不定要看CPU有没有调度时间给你。

#8


引用 6 楼  的回复:
引用 5 楼  的回复:

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


问的好。

#9


我也看过一点,jvm方面的书。

我猜测可能是这样的。

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

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

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

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

一种是检查型。

比如你虚拟机参数为

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


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


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


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


这是个人猜测,不一定对。

#10


引用 7 楼  的回复:
这个就像你在饭店吃饭,你点好了菜,菜按顺序上的,你调了system.gc(),厨师看你催的急给你插个队,所以说不定要看CPU有没有调度时间给你。
那也就是说,手动调用system.gc()还是会起作用的。那么如果频繁调用,如1分钟调用一次,当一个线程执行完一次,调用一次,是否会导致内存的使用反而增加?大家回复了这么多,我还是没有弄明白是否会内存有影响?会不会导致系统当机?

#11


会有影响吧。你想想,一直催着jvm做事,搞不好它忙不过来而且又是相同的资源,可能很消耗内存

#12


做过一个 试验,不一定准确,在一个并发比较高的程序中,每次线程结束都调用一下System.gc(),结果内存下来了,原来会上升到300M左右会被JVM给清理掉,现在会稳定在30M左右,但CPU由由原来的1.5%左右上升到了6%左右,跟踪了一下线程,发现会有好多堆栈跟踪的线程在频繁启动,所以个人感觉频繁调用System.gc()对资源还有一定消耗的。

#13


嗯,ls说得很好~

#14


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还是不能随便适用嘀~

#15


system.gc()只是建议jvm回收垃圾,但决定权还是在JVM手里,由她决定是否现在要回收垃圾。

#1


Sysytem.gc();只是告诉JVM垃圾回收,但是至于JVM是否会回收是没办法控制的。所以你调用不调用gc对系统来说没有太大的影响。

#2


Sysytem.gc(); 这个只是通知JVM进行垃圾回收,但JVM具体什么时候回收是程序员无法控制的。

#3


有吧,就比如一个系统,你登陆后用map保存一些你需要的临时数据,退出的时候必须用system.gc()进行摧毁,当然如果很久不用map里面的键值对就可以不用system.gc()了,jvm会自动清除的。

#4


引用 1 楼  的回复:
Sysytem.gc();只是告诉JVM垃圾回收,但是至于JVM是否会回收是没办法控制的。所以你调用不调用gc对系统来说没有太大的影响。
也就是说,果然程序的频繁调用GC,但是JVM没有到达要求,也不会去执行,虽然手动要求执行,但是系统内部还是要由JVM决定是吗?

#5


恩  是的.JVM回收垃圾是其内部判断是否应该进行垃圾回收。而不受外部支配

#6


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

#7


这个就像你在饭店吃饭,你点好了菜,菜按顺序上的,你调了system.gc(),厨师看你催的急给你插个队,所以说不定要看CPU有没有调度时间给你。

#8


引用 6 楼  的回复:
引用 5 楼  的回复:

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


问的好。

#9


我也看过一点,jvm方面的书。

我猜测可能是这样的。

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

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

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

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

一种是检查型。

比如你虚拟机参数为

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


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


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


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


这是个人猜测,不一定对。

#10


引用 7 楼  的回复:
这个就像你在饭店吃饭,你点好了菜,菜按顺序上的,你调了system.gc(),厨师看你催的急给你插个队,所以说不定要看CPU有没有调度时间给你。
那也就是说,手动调用system.gc()还是会起作用的。那么如果频繁调用,如1分钟调用一次,当一个线程执行完一次,调用一次,是否会导致内存的使用反而增加?大家回复了这么多,我还是没有弄明白是否会内存有影响?会不会导致系统当机?

#11


会有影响吧。你想想,一直催着jvm做事,搞不好它忙不过来而且又是相同的资源,可能很消耗内存

#12


做过一个 试验,不一定准确,在一个并发比较高的程序中,每次线程结束都调用一下System.gc(),结果内存下来了,原来会上升到300M左右会被JVM给清理掉,现在会稳定在30M左右,但CPU由由原来的1.5%左右上升到了6%左右,跟踪了一下线程,发现会有好多堆栈跟踪的线程在频繁启动,所以个人感觉频繁调用System.gc()对资源还有一定消耗的。

#13


嗯,ls说得很好~

#14


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还是不能随便适用嘀~

#15


system.gc()只是建议jvm回收垃圾,但决定权还是在JVM手里,由她决定是否现在要回收垃圾。