RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 746131
Accepted
Иван Гладуш
Иван Гладуш
Asked:2020-11-18 01:15:56 +0000 UTC2020-11-18 01:15:56 +0000 UTC 2020-11-18 01:15:56 +0000 UTC

JAVA中是否可以杀死GC

  • 772

我正在面试,面试官问是否有可能在Java中杀死GC。对于另一个问题,如果应用程序有效,他的回答是肯定的。我说不重建JDK就无法做到这一点,或者更确切地说,我建立了一些猜测,但是为了让应用程序工作,我不知道该怎么做。面试官说可以和需要什么google一下,我在google上没找到类似的,请告诉我。

java
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Виктор
    2020-11-18T01:22:59Z2020-11-18T01:22:59Z

    不。您不能以编程方式终止 GC。面试官期待一些答案,例如:

    不能强制进行垃圾收集。垃圾收集器在内存不足的情况下运行。当它运行时,它会释放一个无法访问的对象分配的内存。垃圾收集器在低优先级守护程序(后台)线程上运行。您可以通过调用 System.gc() 很好地要求垃圾收集器收集垃圾,但您不能强制它。

    注意:杀死 GC 的唯一方法是退出应用程序。System.exit();


    不。你不能从代码中杀死 GC。面试官希望得到这样的回应:

    GC 无法停止。它从内存所剩无几时开始。开始工作时,它将内存从被遗忘的(无法访问的,没有引用的对象)中释放出来。GC 在低优先级守护线程上运行。您唯一能做的就是通过调用 System.gc() 要求它进行垃圾收集,但您无法阻止它。

    ps 虽然可以,但可以使用开发大师 System.exit() 的一个秘密命令;

    资源


    这是我唯一能找到的。

    恕我直言:当内存不足时,GC 会打开。如果程序没有用完所有的内存,那么它就不会开始工作,你可以说它死了,但事实并非如此。如果他们都以未知的方式杀死了他,那么您将通过 OutOfMemoryError 知道这一点,并且应用程序将停止


    按照@ViacheslavVedenin的想法,如果在 finalize 中,GC 会发生什么

    • 停止线程GC
    • 永远循环 GC 线程
    • 抛出异常

    @ViacheslavVedenin自己在码头上写道,我决定进行实验。并且没有区别。

    正常操作日志

    登录 cThread.currentThread().stop();完成

    登录自while(true);

    登录 cthrow new RuntimeException();完成

    老实说,我并没有注意到太大的区别,所以我认为在为 finalize 创建新线程时 GC 并不真正关心它,也不遵循它。完成后,对象将被删除。线程结束的原因并不困扰他,既然它已经结束,那么它已经做了它可以做的一切。


    我还将添加@Suvtruf同志的答案,以便它们更加引人注目:

    • GC可以被禁用
    • 谷歌根据“Shipilev”、“GC without GC”等词
    • jug.ru 上的文章
    • 关于集线器的文章
    • 10
  2. Slava Vedenin
    2020-11-18T05:22:18Z2020-11-18T05:22:18Z

    有可能(虽然不是杀死,而是强制抛出 OutOfMemory 并停止垃圾收集,而应用程序将能够继续工作),这是一个示例:

    import java.io.IOException;
    
    public class Test1 {
    
        private static class TestClass {
            private byte[] bytes = new byte[100000];
            public int i = 0;
            public static volatile boolean flag = true;
    
            protected void finalize() throws IOException {
                int i = 1;
                while (flag) {
                    i++;
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            TestClass t1 = new TestClass();
            new Test1().test(0, t1);
        }
    
        private void test(int j, TestClass t1) throws InterruptedException {
            try {
                for (int i = 1; i <= 100000; i++) {
                    TestClass t = new TestClass();
                    System.out.println(i);
                }
            } catch (OutOfMemoryError e) {
                j++;
                t1.i = j;
                System.out.println("I alive!!! " + t1.i);
                if( j > 100) {
                    TestClass.flag = false;
                }
                test(j, t1);
            }
        }
    }
    

    这里发生了什么?根据规范,收集器必须finalize在删除对象之前执行,因为无限循环finalize,它将无法删除对象并开始抛出 OutOfMemoryError(但是,您可以只使用永恒的对象引用)。在这种情况下,无法创建新对象,但您可以继续使用旧对象和堆栈(参见 catch (OutOfMemoryError e) 中的代码)。包括重用已经存在的对象,例如,将新数据存储在旧对象中(您甚至可以编写自己的 new 和 delete 类似物,使用字节数组作为数据存储和“序列化”对象)。

    一段时间后,我们关闭终结器中的无限循环,然后像往常一样进行垃圾收集和对象创建。

    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5