`
高级java工程师
  • 浏览: 410259 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

System.gc()与Runtime.getRuntime().gc()区别

阅读更多
首先,我们需要明确一点的是,两个gc都会强制触发垃圾收集,它们只是向JVM建议,现在也许是收集垃圾的好时机。
比较
System.gc()调用起来更方便,但是会给应用带来不必要的性能问题。还可以通过参数-XX:+DisableExplicitGC.禁止显示调用gc。
Runtime.getRuntime()用来与Java运行时进行交互,调用该方法会建议JVM花费精力回收不再使用的对象。
源代码
System.gc()源代码, 来自System.java

  /**
     * Runs the garbage collector.
     * <p>
     * Calling the <code>gc</code> method suggests that the Java Virtual
     * Machine expend effort toward recycling unused objects in order to
     * make the memory they currently occupy available for quick reuse.
     * When control returns from the method call, the Java Virtual
     * Machine has made a best effort to reclaim space from all discarded
     * objects.
     * <p>
     * The call <code>System.gc()</code> is effectively equivalent to the
     * call:
     * <blockquote><pre>
     * Runtime.getRuntime().gc()
     * </pre></blockquote>
     *
     * @see     java.lang.Runtime#gc()
     */
    public static void gc() {
        Runtime.getRuntime().gc();
    }


Runtime.getRuntime().gc()源代码,来自Runtime.java


/**
     * Runs the garbage collector.
     * Calling this method suggests that the Java virtual machine expend
     * effort toward recycling unused objects in order to make the memory
     * they currently occupy available for quick reuse. When control
     * returns from the method call, the virtual machine has made
     * its best effort to recycle all discarded objects.
     * <p>
     * The name <code>gc</code> stands for "garbage
     * collector". The virtual machine performs this recycling
     * process automatically as needed, in a separate thread, even if the
     * <code>gc</code> method is not invoked explicitly.
     * <p>
     * The method {@link System#gc()} is the conventional and convenient
     * means of invoking this method.
     */
    public native void gc();


示例:



import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by EricYang on 2019/7/13.
 */
@Slf4j
public class GcMainDemo {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        for(int i=0;i < 100; i++) {
            stringList.add(new String("The " + i + "th string"));
        }

        //unit bytes
        long maxMemBefore = Runtime.getRuntime().freeMemory();
        //System.gc();
        Runtime.getRuntime().gc();
        long maxMemAfter = Runtime.getRuntime().freeMemory();
        log.info("System.gc(), maxMemBefore={}, maxMemAfter={}, diff={}kb", maxMemBefore, maxMemAfter, (maxMemAfter - maxMemBefore)/1024);
        for(int i=0;i < 100; i++) {
            stringList.add(new String("The " + i + "th string"));
        }
        maxMemBefore = Runtime.getRuntime().freeMemory();
        Runtime.getRuntime().gc();
        maxMemAfter = Runtime.getRuntime().freeMemory();
        log.info("Runtime.getRuntime().gc(), maxMemBefore={}, maxMemAfter={}, diff={}kb", maxMemBefore, maxMemAfter, (maxMemAfter - maxMemBefore)/1024);
        try {
            TimeUnit.SECONDS.sleep(2000);
        } catch (Exception ex) {
            log.error("sleep exception", ex);
        }
    }
}



程序运行输出(不同机器运行结果不一样)
16:39:22.616 [main] INFO com.yq.GcMainDemo - System.gc(), maxMemBefore=244672784, maxMemAfter=253615304, diff=8732kb
16:39:22.635 [main] INFO com.yq.GcMainDemo - Runtime.getRuntime().gc(), maxMemBefore=250951864, maxMemAfter=253949240, diff=2927kb
结论
两者一样。除了方法名称不同, System.gc()是静态方法, 而Runtime.getRuntime().gc()是实例方法,没有实质差别。

分享到:
评论

相关推荐

    10常用类2.doc

    Java中的`Runtime`类是每个Java应用程序都会自动创建的一个...手动触发垃圾回收(通过`System.gc()`或`Runtime.getRuntime().gc()`)并不推荐,因为这可能会对性能产生负面影响,因为垃圾回收的时机最好由JVM自行决定。

    Android加载大图片OOM异常解决

    System.gc(); } ``` 在上面的代码中,我们首先检查 Bitmap 对象是否为空和是否已经回收,如果是,则回收 Bitmap 对象并手动调用 GC。 解决方案 4:图片必须进行缩放 在加载大图片时,图片的大小是一个重要的因素...

    变态版java笔试试题

    GC 可以通过 System.gc() 或 Runtime.getRuntime().gc() 方法请求垃圾收集。 二、字符串 创建一个字符串 "xyz" 时,实际上创建了两个对象,一个是 "xyz" 本身,另一个是指向 "xyz" 的引用对象 s。 三、Math 函数 ...

    九阴真经-java

    * 可以通过 System.gc() 或 Runtime.getRuntime().gc() 请求垃圾收集。 7. String 对象的创建: * new String("xyz") 创建两个对象,一个是“xyz”,一个是指向“xyz”的引用对象 s。 8. Math.round() 的使用: ...

    JAVA程序员面试题(含有答案)经典版

    实际上调用 System.gc() 就相当于调用 Runtime.getRuntime().gc() 方法。 3. Error 和 Exception 的区别: Error 是表示由 JVM 进行处理,是 JVM 出错。Exception 是可以由程序进行处理的,使用 try..catch 进行...

    中软国际Java程序员笔试题及答案.pdf

    要请求垃圾收集,可以调用System.gc()或Runtime.getRuntime().gc()方法。 11. String s = new String("xyz");创建了几个String Object? 两个对象,一个是“xyz”,一个是指向“xyz”的引用对象s。 12. Math.round...

    100道 Jvm面试题总结及答案.docx

    Jvm 的垃圾回收机制可以通过 System.gc() 或 Runtime.getRuntime().gc() 方法来触发。 Jvm 的类加载机制采用双亲委托机制,即除了顶层的启动类加载器以外,其余的类加载器,在加载之前,都会委派给它的父加载器进行...

    Java中String和StringBuffer的区别.doc

    在Java编程语言中,String和StringBuffer是两个重要的类,它们在处理文本数据时有着显著的...调用System.gc()或Runtime.getRuntime().gc()可以请求执行垃圾收集,但这些方法仅作为提示,实际何时执行GC由JVM自行决定。

    android_内存溢出处理

    可以使用 dalvik.system.VMRuntime 类提供的 setTargetHeapUtilization 方法来增强程序堆内存的处理效率。 例如: ```java private final static float TARGET_HEAP_UTILIZATION = 0.75f; VMRuntime.getRuntime()....

    J2ME 最佳实践,J2ME 是Sun 发布的运行在小型设备上的微型版Java 的一系列标准

    例如,当需要从网络下载较大图像时,应先调用`System.gc()`触发垃圾回收,随后通过`Runtime.getRuntime().freeMemory()`检查当前可用内存。如果内存不足,应向用户发出警告而非直接导致程序崩溃,确保用户体验。 ``...

    Java源码获取程序运行环境的信息

    3. **运行时信息**:`Runtime.getRuntime()`返回一个`Runtime`对象,用于与Java虚拟机进行交互。你可以通过它来获取CPU核心数、总内存、剩余内存等信息。例如,`Runtime.getRuntime().availableProcessors()`返回...

    JavaSE综合测试一参考.pdf

    文档中提到了System.gc()和Runtime.getRuntime().gc()方法,它们用于建议JVM执行垃圾回收,释放不再使用的对象内存。 8. 类型转换和精度丢失 通过代码片段`int x=(int)y;`可以发现,将double类型变量y强制转换为int...

    java 试题的一些题型

    `System.gc()`和`Runtime.getRuntime().gc()`用于请求垃圾收集。 19. `String`对象创建: - `String s = new String("xyz");`创建了两个对象,一个在常量池,一个在堆内存。 - `String s = "xyz";`只创建了一个对象...

    java九阴真经java九阴真经.doc

    通过System.gc()或Runtime.getRuntime().gc()可以请求垃圾收集,但通常不推荐这样做,因为这可能导致性能下降。 7. **String对象创建**:`String s = new String("xyz");`创建了两个对象,一个是字面量"xyz",另一...

    java初级-中级问题解答2.doc

    调用System.gc()或Runtime.getRuntime().gc()可以请求垃圾收集,但不保证立即执行。 9. **String对象创建**:`String s = new String("xyz");`创建了两个对象,一个字符串常量"xyz",一个指向它的String对象s。 10...

    java基础知识概况

    `System.gc()`和`Runtime.getRuntime().gc()`是建议JVM进行垃圾回收的语句,但它们只是建议,并不能强制执行。垃圾回收器会在适当的时候自动回收不再使用的对象所占用的内存。 总结来说,Java的基础知识包括但不...

    变态JAVA面试32问.pdf

    在Java中,可以通过System.gc()或Runtime.getRuntime().gc()方法请求虚拟机进行垃圾回收,但具体时机由垃圾收集器决定。 9. 异常处理中的sleep()和wait()方法 sleep()方法属于Thread类,使当前线程暂停执行指定的...

Global site tag (gtag.js) - Google Analytics