【问题标题】:Display available stack memory in Java在 Java 中显示可用的堆栈内存
【发布时间】:2021-07-21 10:12:21
【问题描述】:

我试图在递归程序执行期间显示消耗的堆栈空间,例如按顺序遍历树。有没有办法在 Java 中打印可用的堆栈空间,我知道可以使用 Runtime.getRuntime().freeMemory() 显示可用的堆内存。

【问题讨论】:

  • 你说的显示是什么意思?你想当时抓住线程/堆吗?你想以编程方式(从运行应用程序)还是从应用程序外部手动/编写脚本?请提供更多详细信息。

标签: java


【解决方案1】:

由于各种原因,Java 不允许您访问此类信息:

  1. 跟踪该信息实际上可能会使某些优化变得不可能
  2. 在某个点给出准确的数字可能会减慢执行速度(由于可能需要进行反优化)。
  3. 剩余可用空间的确切数量可能会随时间而变化(例如,如果堆栈空间是从共享空间动态分配的而不是固定的)。
  4. 您可能获得的任何值很可能只有有限的价值(因为您无法确定在各种情况下给定方法调用需要多少字节)。

您可以获得的最接近是获取当前堆栈跟踪(例如使用Thread.getStackTrace())并检查返回的数组大小以了解有多少堆栈正在使用中(即堆栈的深度)。

但即使是这样的操作也可能有点昂贵。

【讨论】:

  • 也许StackWalker API 可以用来降低一点成本(至少可以避免实现数组)。
  • @Hulk:这很可能会稍微降低成本。但问题是,获取堆栈跟踪的行为会使一些优化(例如内联)变得更加困难/更加昂贵。所以即使这提高了性能,我认为它不会完全消除缺点。
  • 同意。确定堆栈深度的任何一种方法都将分配多个对象(并涉及多个级别的方法调用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2023-04-06
  • 2012-01-20
  • 2015-03-03
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多