- 论坛徽章:
- 0
|
回复 22# zhaopingzi
谢谢提问,这个问题涵盖的范围有些大,所以在《WebLogic实战》连续的第16/17/18章都是相关内容。
总体而言,几个注意要点:
1. 最简单的,JVM本身开的空间即不够,可以调节起始值-Xms和最大值-Xmx;32位的经常还需要调节操作系统参数才能将分配给JVM的内存扩上去;不过这里面有些杂七杂八的小技巧:
(1) 在一般的JDK实现中,在生产环境多将两个值设成一样以提高性能;
(2) 但在IBM的AIX生产环境下,反而需要设成不一样来优化内存碎片,因为它的实现不是基于标准的代的概念,而是P簇/K簇这样的思路;
(3) 在HP的UX环境下,通常随着这两个参数不同,会自适应触发出不同的进程模式,所谓q3p,q4p等,可用最大Heap空间大小是变动的。
2. 另外,在大多数JDK实现中,一般会保留一个相关的各种Class的代码段,通常所说的Permanent区域,也可能是这个不够;因为它不参与垃圾回收,所以需要给出足够的空间;
3. 再者,由于JVM顾名思义,是虚拟机,所以不会象硬件CPU一样,有ALU,有AX/BX/PC等诸多寄存器和运算器,所以其映射为一个个Frame帧来模拟,如果Frame链的空间不够,多半会体现在堆栈溢出上;
4. 当然,最常见的还是内存泄漏,需要捕获内存镜像(多次最好),比如JDK自带的命令Jmap等,然后用工具分析,MAT/HA等,这个需要实际处理的经验,就象医生看X光片一样:
(1) 找内存占用最大的几个部分;
(2) 找内存占用变化最大的几个部分;
5. 还有比较隐藏比较深的,比如内存碎片,虽然整个Heap的空余空间绰绰有余,但还是报内存不够,主要起因于空闲内存空间不连续,就象以前硬盘小做磁盘整理时,星星点点的红色区域无法移动一样;
6. 此外,象JMS/EJB等,或者应用上,大规模的对象申请和占用,都会容易触发该类问题,在GIS系统,基于WLI/OSB的工作流和业务系统都容易碰到。
|
|