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控制的每个线程分配):方法调用帧,参数,返回值,本地声明的基元&对象的引用 >静态常量(基元) 见http://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryMXBean.html和http://www.yourkit.com/docs/kb/sizes.jsp
> Java SE / Java EE中没有包含标准方法来获取每个线程堆栈的实际内存使用量. 我建议你不要在你的建议的问题,因为: >如果没有一些复杂的特定于JVM的API,那么您不能在动态线程堆栈内存使用中使用仪器/内部信息 – 在哪里可以找到这样一个API? 反模式是在设计和开发过程中不要对这些事情进行适当的思考,只是想象一些运行时反省的魔法可以弥补这一点.可能存在一些(罕见的)高性能要求的应用程序,这些应用程序需要在运行时大大地重新排列算法以与发现的资源完全匹配 – 但这是复杂的,丑陋的昂贵. 即使如此,它可能会更好地从“-Xss”参数在宏级别驱动动态算法更改,而不是在代码中位置的确切堆栈内存消耗的微观级别. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |