64位windows操作系统下尽量不要使用32位JDK (三)

2014-11-24 09:12:27 · 作者: · 浏览: 19
DLLShared\;D:\Program Files (x86)\QuickTime\QTSystem\;d:\SSH Communications Security\SSH Secure Shell
USERNAME=mortimer
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel

--------------- S Y S T E M ---------------

OS: Windows 7 , 64 bit Build 7601 Service Pack 1

CPU:total 4 (2 cores per cpu, 2 threads per core) family 6 model 42 stepping 7, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, ht

Memory: 4k page, physical 8273136k(4724820k free), swap 16544420k(12014064k free)

vm_info: Java HotSpot(TM) Server VM (20.6-b01) for windows-x86 JRE (1.6.0_31-b05), built on Feb 3 2012 18:35:56 by "java_re" with MS VC++ 7.1 (VS2003)

time: Mon Aug 27 15:11:04 2012
elapsed time: 66 seconds

发生问题以后,再次启动AS,使用jconsole监控,加os的资源管理器查看,一切看起来都非常正常。单单从错误日志来看,是内存不足导致JVM的carsh。

但是,本机有8G内存,运行此应用时,仅仅用了不到3G,试着使用-Xmx加大内存,试着提升到1600M,但是,无法启动,最终定位在1200M,但是,AS依然会在运行一段时间后crash。
接下来就是各种google,有人说这是jdk1.6的bug不过人家的小版本号是25(甚至还有某些号称某电商的人,建议回滚至update24版本),我这是31,难道这个bug一直没有关闭?关于这个问题在StackOverflow有一篇帖子 问题跟我一样,并且采用了各种办法貌似是最终解决了。


楼主在启动时加上了-XX:-DoEscapeAnalysis参数,但是我这依然不可以,这个参数貌似是不再分析可能的溢出,我这只是将crash的时间稍微延后了一些,问题依然没有解决。

再查看此帖的后面,说是降低-Xmx的大小,而且在jvm的崩溃日志中也提到降低-Xmx/Xms的大小,于是试着降低大小,并且把as启动时的jvm参数全部去掉,使用默认值。问题竟然解决了,从目前来看,as运行了半小时依然没有问题(开始时是1分钟以内自动crash)。但是,在实际的生产环境中,JVM默认的参数,往往不能满足需要,因此,就出现一个问题:既然操作系统已经安装64位,并且JDK有64位版本存在,生产环境下尽量在64位的os下安装使用64位jdk,从而把性能发挥至最优。


关于为何要降低jvm堆的大小,有以下说明:

[plain]
JVM线程堆栈

应用程序中的每个线程都需要内存来存储器堆栈(用于在调用函数时持有局部变量并维护状态的内存区域)。每个 Java 线程都需要堆栈空间来运行。

根据实现的不同,Java 线程可以分为本机线程和 Java 堆栈。除了堆栈空间,每个线程还需要为线程本地存储(thread-local storage)和内部数据结构提供一些本机内存。

JVM堆栈大小

-Xss 128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆 栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。 www.2cto.com

在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一 个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

JVM heap与JVM私有内存、JVM线程堆栈大小间的关系及平衡。

线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时

时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会

出现内存溢出的错误.