tha*_*all 6 java stack-overflow stack jvm
在我的java Web应用程序中,我有一个后台工作线程,它需要大量的堆栈空间,因为它使用activiti工作流引擎和groovy脚本任务运行一个非常复杂的工作流.
目前,我需要在64位Java和Tomcat上将JVM Xss设置高达16MB,以规避任何StackOverflowErrors.如果发生错误,堆栈跟踪真的很大(几百行),但这一切都发生在引擎内部,所以我无法对它做任何事情.
现在我的问题是:有没有办法在运行时增加单个线程的堆栈大小?
我想将应用程序中所有线程的JVM默认Xss设置降低到512k,我知道这已经足够了,只能运行16M的worker.
Java API为Thread类的构造函数提供了有关此主题的一些信息:
public Thread(ThreadGroup group,
Runnable target,
String name,
long stackSize)
Run Code Online (Sandbox Code Playgroud)
但它提到,行为不能得到保证([1]),我没有找到任何信息,如果它可以在Windows上工作.
另外,如果一个线程的堆栈空间不能增加而且我必须指定16MB作为默认值,那么设置如此高的后果会是什么?这是否意味着每个新线程在初始化时将保留16MB内存(即200个线程*16MB:3,2 GB)?
据我所知,从jconsole和taskmgr可以看出,自Xss设置增加后,内存占用似乎没有太大变化,但也许我错过了一些东西.
任何帮助或澄清将不胜感激.
[1]:http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#Thread (java.lang.ThreadGroup,java.lang.Runnable,java.lang.String,长)
-XssHotSpot 指定最大大小,而不是它将使用的大小,这一点毫无意义。使用的大小基于使用情况,因此如果您指定的值过大,则会浪费虚拟内存(这在 32 位 JVM 上可能是一个问题),但不会浪费物理内存。如果您有 64 位 JVM,那么将线程设置为您想要的最大值并没有什么坏处。
另外,如果一个线程的堆栈空间无法增加,而我必须指定16MB作为默认值,那么如此高的设置会产生什么后果?这是否意味着每个新线程在初始化时都会保留 16MB 内存(即 200 个线程 * 16MB:3.2 GB)?
每个线程都会使用这么多的虚拟内存。在 32 位 JVM 上,即使实际使用的内存很少,也会耗尽地址空间。在 64 位 JVM 上,您的限制是 TB,并且只有实际使用的堆栈才会使用主内存。
| 归档时间: |
|
| 查看次数: |
1473 次 |
| 最近记录: |