设置 Java 调用栈

Posted

技术标签:

【中文标题】设置 Java 调用栈【英文标题】:Set Java call stack 【发布时间】:2013-08-01 07:18:03 【问题描述】:

是否可以修改/访问 Java 调用堆栈?例如保存和恢复?我正在考虑实现协作式多任务处理(尤其是 I/O),就像用于 python 或 haskell 的 gevent (本机执行此操作)一样。异步回调意大利面混乱不是最好的解决方案。

【问题讨论】:

【参考方案1】:

最简单的解决方案是拥有多个线程。您可以在服务器上高效运行多达 10,000 个线程。如果您需要的远不止这些,我建议 a) 购买第二台服务器,或 b) 使用非阻塞 IO。

一般来说,使用多线程是最简单的,对于少量线程,也是最快的。

在 Java 中有各种库可以以各种方式执行此操作。它们都有一个共同的问题,要么速度较慢,要么复杂得多,或者两者兼而有之。

顺便说一句,我提出这一点是因为当线程上下文切换时,它完全按照您的建议执行,但操作系统会为您执行。

【讨论】:

10,000 会很不错。但我认为如此大量的线程将意味着大量的上下文切换,这反过来又会大大降低性能。当线程需要通信时,情况会变得更糟。轻量级线程很好,因为没有涉及内核锁定等的上下文切换。如果 Java 允许我以编程方式访问堆栈,实际上它非常简单。我喜欢廉价的原生操作系统线程的概念,但我认为这是不可能的。编辑:然后可以使用异步 IO 管理轻量级线程。 Java 线程不一定是内核线程。 JVM 可以随意实现线程,并且线程池很常见。修改实时调用堆栈与重写 VM 基本上是一样的,并且没有办法从 Java 本身中做到这一点。 VM 代理可以这样做,但您最好使用您已经可用的已调试和调整的线程实现。 我不知道除了第一个 JVM (1.1) 之外不使用内核线程的 JVM。但是它们很快就变成了内核线程。因此,JVM 实现有时会支持轻量级线程的可能性很小。对于网络应用程序,绿色线程是您要走的路。不幸的是,只有少数语言真正支持绿色线程,例如 Haskell、Go 和 C#(C# 有点伪造它们,不如 Haskell 或 Go 漂亮),使用 Gevent 的 Python。好吧,我想我必须使用 10 亿行回调意大利面条代码 =( 有些库支持延续,但这些库速度较慢且不用于性能(它们可能因其他原因而有用)在您执行复杂代码之前,我会检查您的需要这样做,因为您可能会发现这样做完全是浪费您的时间。我会让操作系统线程做他们设计做的事情,除非你知道这是一个问题,而不是基于感觉不必这样做会很好。

以上是关于设置 Java 调用栈的主要内容,如果未能解决你的问题,请参考以下文章

递归调用太深,可能导致栈溢出

java调用栈中行号

java调用栈中行号

java调用栈中行号

“调用栈”和“线程栈”的区别

java 中打印调用栈