首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在垃圾收集例程运行之前,程序何时终止?

在垃圾收集例程运行之前,程序何时终止?
EN

Stack Overflow用户
提问于 2014-12-12 13:15:32
回答 3查看 1.1K关注 0票数 1

我正在阅读"Oracle认证助理,Java 7程序员学习指南“一书。

在finalize方法的主题上,有一句话:“无法保证该方法将执行,因为程序可能会终止,而不需要运行垃圾收集”。

我的问题是:在垃圾收集例程运行之前,程序为什么以及何时终止?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-12 13:20:18

运行这个程序

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    new Object() {
        @Override
        protected void finalize() throws Throwable {
            System.out.println("GC");
        }
    };
}

程序将终止,但GC不能工作。如果是这样的话,那么它将调用finalize(),我们将看到控制台上的输出。当JVM在堆上低时运行GC,要使它运行,请添加以下代码

代码语言:javascript
复制
    for(int i = 0; i < 1000; i++) {
        byte[] a = new byte[100000000];
    }

它创建了大型数组,快速填充堆,这使得JVM运行GC,实际上GC可能会运行几次,但JVM只能调用一次。

票数 2
EN

Stack Overflow用户

发布于 2014-12-12 13:19:05

程序可能会终止以下情况。

无论恶魔线程如何,所有线程都会停止。

将发生System.exit();

内存不足。

强行关机(从操作系统到程序的杀死信号)。

票数 0
EN

Stack Overflow用户

发布于 2014-12-12 13:20:36

在垃圾收集方面,您得到的唯一保证是在抛出OutOfMemoryError之前,它已经尽了最大的努力。

理论上,您可以有一个JVM,其中“最大的努力”意味着“什么都不做”,因为它没有垃圾收集器。

在实践中,如果您有一个短暂的JVM实例(例如,一个只运行1-2秒的简单工具),或者如果您的进程实际上没有分配多少内存(例如,等待请求的服务器进程),则GC通常不会运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27444496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档