当前位置: 首页 > 面试题库 >

了解Java堆栈

陶高峯
2023-03-14
问题内容

有以下代码:

public class Main {
    public static void main(final String[] args) throws Exception {
        System.out.print("1");
        doAnything();
        System.out.println("2");
    }

    private static void doAnything() {
        try {
            doAnything();
        } catch (final Error e) {
            System.out.print("y");
        }
    }
}

并有输出:

1yyyyyyyy2

为什么它打印八次而不是“ y”。遇到Java println()时如何调用StackOverflowError


问题答案:

在这里您正在捉住,Error而不是Exception在这种情况下您的程序会崩溃。

如果您尝试此代码(修改为添加静态计数器)

public class StackError {

static int i = 1;

public static void main(final String[] args) throws Exception {
    System.out.print("1");
    doAnything();
    System.out.println("2");
}

private static void doAnything() {
    try {
        i++;
//          System.out.println(i);
        doAnything();
    } catch (Error e) {
        System.out.print("y"+i+"-");

    }
}
}

输出量

 1y6869-2

因此,它已进行了stackerror6869次(不同运行次数的更改),并打印了最后一个值。如果您只是y像以前那样打印,则可能是输出被缓冲而不被刷新,因为它不是println

更新资料

System.out.println内部调用PrintStream该缓冲。您不会丢失缓冲区中的任何数据,它会在缓冲区满后或显式调用flush时将所有数据全部写入到output(在您的情况下为端子)。

回到这种情况,这取决于内部动态,即堆栈已被填满多少,可以从捕获中执行多少打印语句doAnything()以及将这些字符数写入缓冲区。最后在主背上印有数字2

javadoc对缓冲流的引用



 类似资料:
  • 问题内容: 为了确定Java堆大小,我使用了以下命令: 但是,我无法理解ErgoHeapSizeLimit,HeapSizePerGCThread,InitialHeapSize,LargePageHeapSizeThreshold,MaxHeapSize等的含义。有人可以简要解释一下这些术语。其实我是Java的新手 其实我需要确定我的机器可以分配给进程的堆大小吗?因为我的应用程序之一需要以下参数

  • 主要内容:on-heap 堆内内存是什么?,JVM 堆内存是如何去划分的?,JVM 堆内存满了后会怎么样?,基于堆外内存解决系统 GC 卡顿问题今天给大家聊一个很有意思的知识,就是 off-heap 堆外内存,平时出去面试,或者研究一些技术的时候,经常可能会遇到 off-heap 堆外内存这个东西,但是很多人可能还不知道 off-heap 堆外内存到底是什么,所以今天就给大家来深入的分析一下。 on-heap 堆内内存是什么? 要说这个 off-heap 堆外内存,就得先说 on-heap 也就

  • 问题内容: 例如,Python中的函数使用该模块返回文件中最常见单词的计数。 我已经跟踪了该文件,但是在理解如何相对于假设的单词创建/更新堆方面遇到了一些麻烦。 因此,我认为对我来说最好的理解方法是弄清楚如何从头开始创建堆。 有人可以提供伪代码来创建表示字数的堆吗? 问题答案: 这是在这里找到的代码的略微修改版本:http : //code.activestate.com/recipes/5770

  • 问题内容: 我想知道是否有人可以指出有关解释用提取的Java线程堆栈的信息。 我的情况是我在GlassFish v2.1.1上运行了一个Java EE 5应用程序,该应用程序定期挂起(每天至少挂2次-3次)。要使其再次运行,我必须终止Glassfish进程并重新启动域。 。应用程序通常会变得越来越慢,直到最终完全挂起。一旦挂起,我将无法获得线程堆栈。我已经能够获得一个线程堆栈,因为它变得越来越慢,

  • 代码运行良好。只是我不明白。在递归部分有困难的。在此部分中:我的想法是,首先它将一直执行直到一个阈值。则它将执行一次。因此只会被赋值一次。显然那不是真的。 对我来说,困难的部分是在方法中,做什么?在方法中,、做什么?

  • 问题内容: 我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。 我的问题是: 1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的