java – 计算方法调用栈大小来检查StackOverflowException

前端之家收集整理的这篇文章主要介绍了java – 计算方法调用栈大小来检查StackOverflowException前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天早上我回答了一个与StackoverflowException相关的问题.该人已经询问何时发生Stackoverflow异常

请参阅此链接Simplest ways to cause stack overflow in C#,C++ and Java

所以我的问题是有什么方法可以在我们的程序中动态地计算方法调用堆栈大小,然后在调用一个方法之前应用一个检查,该方法检查方法调用堆栈是否有空间来容纳它,以防止StackOverflowException.

因为我是一个java人,我正在寻找java,但也寻找与这个概念相关的解释,没有任何编程语言的界限.

解决方法

对于32位JVM,JVM可用的总内存大约为2-4GB,64位JVM的大小为大约4-16EB. JVM将其内存分解为:

>堆内存(通过JVM选项-Xms和-Xmx控制的分配)

>构造的对象和数组实例
>静态类和数组数据(包括对象/数组实例)
>线程实例(对象实例,运行时数据和元数据,包括线程对象监视器锁定引用)

>非堆存储器

>堆栈堆栈内存

>每线程堆栈内存(通过JVM选项-Xss控制的每个线程分配):方法调用帧,参数,返回值,本地声明的基元&对象的引用

>静态常量(基元)
> String实例池
java代码:加载类和元数据
> JVM内部使用内存(JVM代码和数据结构)

http://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryMXBean.htmlhttp://www.yourkit.com/docs/kb/sizes.jsp

Is there any method by which we can compute the method call stacks size dynamically in our program

> Java SE / Java EE中没有包含标准方法获取每个线程堆栈的实际内存使用量.
>有标准的方法获取聚合非堆内存:MemoryMxBean.getNonHeapMemoryUsage().参考这个不允许你做出动态代码决定,以避免StackOverflow异常
>有没有标准的方法可以获得没有内存使用的调用堆栈:Thread.getStackTrace() ThreadMxBean.getThreadInfo()& ThreadInfo.getStackTrace()

我建议你不要在你的建议的问题,因为:

>如果没有一些复杂的特定于JVM的API,那么您不能在动态线程堆栈内存使用中使用仪器/内部信息 – 在哪里可以找到这样一个API?
>每个线程堆栈通常相对于整个JVM消耗的内存很少,因此通常很容易分配足够的数据,以适应您的算法(例如Windows 64位JVM的默认值为128KB堆栈大小,而2GB的内存可能已经被预算了对于整个JVM)
>这将是非常有限的权力:如果你的逻辑实际上需要调用一个方法,但你不能由于内存不足,那么你的程序将在那一刻被打破. StackOverflow异常实际上是最好的响应.
>你想做什么可能是一个反设计的反模式.
“正确”的方法是指定程序要求,指定所需的运行时环境(包括最小/所需的内存!),并相应地设计程序以获得最佳性能和内存使用.

反模式是在设计和开发过程中不要对这些事情进行适当的思考,只是想象一些运行时反省的魔法可以弥补这一点.可能存在一些(罕见的)高性能要求的应用程序,这些应用程序需要在运行时大大地重新排列算法以与发现的资源完全匹配 – 但这是复杂的,丑陋的昂贵.

即使如此,它可能会更好地从“-Xss”参数在宏级别驱动动态算法更改,而不是在代码中位置的确切堆栈内存消耗的微观级别.

猜你在找的Java相关文章