Java OutOfMemory Error引发的JVM参数实测--线程堆栈参数篇

本文详述了一次在调整Tomcat的JVM线程堆栈参数Xss后引发的OutOfMemory错误,通过实验验证了Java 1.6 32位默认线程堆栈大小为320k,并分析了Xss设置对线程数量和内存消耗的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在Tomcat的环境中调整了JVM的线程堆栈参数Xss,结果服务器运行一段时间后出现OutOfMemory的错误,导致Tomcat进程异常挂起。于是乎在网上找了大量的资料,并在环境中实际进行测试,终于搞清了这个问题。下面将详细的信息和过程罗列如下,供大家查看和参考。在这篇文章中会重点测试不同的Xss参数对生成的线程数量的影响。以后会再写一篇文章重点测试不同的Xms和Xmx参数对生成的线程数量的影响。得意

先说一下我遇到问题的环境信息。服务器操作系统为Linux RHEL 32位,Tomcat配置的Java为Java 1.6.0_20 32位。以前采用的默认的Xss参数设置,服务器运行正常。从网上看到一些文章说Java 1.5之后的版本的默认线程堆栈大小为1M,于是就把我的环境中的Xss设置为512K,这样就可以生成更多的Java线程,提高Tomcat的处理能力。结果调整完之后就出现Tomcat运行一段时间后异常挂起的情况抓狂。以下是JVM的报错信息:

# java.lang.OutOfMemoryError: requested 1059528 bytes for Chunk::new. Out of swap space?
#
#  Internal Error (allocation.cpp:215), pid=11588, tid=212859792
#  Error: Chunk::new
#
# JRE version: 6.0_20-b02
# Java VM: Java HotSpot(TM) Server VM (16.3-b01 mixed mode linux-x86 )

开始以为是Tomcat的线程池分配过大引起过量的内存消耗引起的,但是将线程池缩小后仍然出现同样的问题。遂开始怀疑是不是Xss的调整引起的问题,如果我的环境中Java版本的默认线程堆栈不是1M,而是小于512K的某个值,那么当我把Xss设置为512K后,则同样的线程数量会消耗更多的内存,从而引起内存溢出的问题。于是在网上开搜,找了很多资料,终于在Oracle的网站上发现这么一段话:( http://www.oracle.com/technetwork/java/hotspotfaq-138619.html )

------------------------------------------------------------------------------------------------------

My application has a lot of threads and is running out of memory, why?

You may be running into a problem with the default stack size for threads. In Java SE 6, the default on Sparc is 512k in the 32-bit VM, and 1024k in the 64-bit VM. On x86 Solaris/Linux it is 320k in the 32-bit VM and 1024k in the 64-bit VM.

On Windows, the default thread stack size is read from the binary (java.exe). As of Java SE 6, this value is 320k in the 32-bit VM and 1024k in the 64-bit VM.

You can reduce your stack size by running with the -Xss option. For example:

java -server -Xss64k
Note that on some versions of Windows, the OS may round up thread stack sizes using very coarse granularity. If the requested size is less than the default size by 1K or more, the stack size is rounded up to the default; otherwise, the stack size is rounded up to a multiple of 1 MB. 64k is the least amount of stack space allowed per thread.

----------------------------------------------------------------------------------------------------------

果然如我的猜测,Java 1.6 32bit的默认线程堆栈大小是320k,64bit才是1M。之前受了网上某些文章的误导,才导致了上述的错误。

在搜索资料的过程中,发现了某位网友提供的一段code用来测试Java可以生成的线程数量。为了进一步验证,用下面这段code在环境中进行了实际测试。测试过程及结论如下:


测试代码:

  1. import java.util.concurrent.CountDownLatch;  
  2.   
  3. p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值