在开发java应用时经常出现OutOfMemory的错误,处理了2天,在此做一记录
1.jvm内存结构介绍
http://wenku.baidu.com/view/d82607ea81c758f5f61f67f6.html
2.jvm内存监控工具
命令工具:jps、jmap、jstatd
jmap:http://blog.csdn.net/gtuu0123/archive/2010/11/27/6039964.aspx
jstatd:http://blog.csdn.net/gtuu0123/archive/2010/11/21/6025484.aspx
可视化工具:jvmstat、jconsole、jvisualvm
http://j2ee2009.javaeye.com/blog/779068
3.jvm参数设定
一般直说设定-Xms, -Xmx等,但没有分情况说明,比如:开发环境Eclipse运行设定、启动tomcat window服务运行的设定
下面这篇说的比较清楚
http://blog.sina.com.cn/s/blog_600448de0100gkzq.html
tomcat6.0除了直接修改注册表外,可以运行%Tomcat_home%/bin/tomcat6w.exe可视化工具进行设置
4.健壮代码规则
1)
、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为
null
,暗示垃圾收集器来收集该对象,防止发生内存泄露。
对于仍然有指针指向的实例,
jvm
就不会回收该资源
,
因为垃圾回收会将值为
null
的对象作为垃圾,提高
GC
回收机制效率;
2)
、我们的程序里不可避免大量使用字符串处理,避免使用
String
,应大量使用
StringBuffer
,每一个
String
对象都得独立占用内存一块区域;
String str = "aaa";
String str2 = "bbb";
String str3 = str + str2;//
假如执行此次之后
str ,str2
以后再不被调用
,
那它就会被放在内存中等待
Java
的
gc
去回收
,
程序内过多的出现这样的情况就会报上面的那个错误
,
建议在使用字符串时能使用
StringBuffer
就不要用
String,
这样可以省不少开销;
3)
、尽量少用静态变量,因为静态变量是全局的,
GC
不会回收的;
4)
、避免集中创建对象尤其是大对象,
JVM
会突然需要大量内存,这时必然会触发
GC
优化系统内存环境;显示的声明数组空间,而且申请数量还极大。
这是一个案例
使用
jspsmartUpload
作文件上传
,
运行过程中经常出现
java.outofMemoryError
的错误,
检查之后发现问题:组件里的代码
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
问题原因是
totalBytes
这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。解决办法只能换一种更合适的办法,至少是不会引发
outofMemoryError
的方式解决。
参考:
http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=3747
jspsmartUpload
为什末要这样作,有他的原因,根据
RFC1867
的
http
上传标准,得到一个文件流,并不知道文件流的长度。设计者如果想文件的长度,只有操作
servletinputstream
一次才知道,因为任何流都不知道大小。
只有知道文件长度了,才可以限制用户上传文件的长度。为了省去这个麻烦,
jspsmartUpload
设计者直接在内存中打开文件,判断长度是否符合标准,符合就写到服务器的硬盘。这样产生内存溢出,这只是我的一个猜测而已。
所以编程的时候,不要在内存中申请大的空间,因为
web
服务器的内存有限,并且尽可能的使用流操作,例如
byte[] mFileBody = new byte[512];
Blob vField= rs.getBlob("FileBody");
InputStream instream=vField.getBinaryStream();
FileOutputStream fos=new FileOutputStream(saveFilePath+CFILENAME);
int b;
while( (b =instream.read(mFileBody)) != -1)
{
fos.write(mFileBody,0,b);
}
fos.close();
instream.close();
5)
、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
6)
、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用
hashtable
,
vector
创建一组对象容器,然后从容器中去取那些对象,而不用每次
new
之后又丢弃
7)
、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成
Out Of Memory Error
的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值
5.扩展Java安全策略
http://dodoflying.javaeye.com/blog/33533
分享到:
相关推荐
JVM 内存参数详解以及配置调优 JVM 内存参数是 Java 虚拟机中最重要的参数之一,它直接影响着 Java 应用程序的性能和稳定性。在这个资源中,我们将详细讨论 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、...
JVM内存参数的设置对Java应用程序的性能有着至关重要的影响。以下是一些常见的JVM内存参数: 1. -Xms:设置初始堆大小。 2. -Xmx:设置最大堆大小。 3. -Xmn:设置新生代大小。 4. -Xss:设置线程栈大小。 5. -XX:...
### JVM内存参数调优详解 #### 一、概述 Java虚拟机(JVM)是执行Java字节码的软件环境,为了提高Java程序的性能和稳定性,合理调整JVM的内存参数至关重要。根据Java启动参数的不同分类,我们可以将其分为标准参数...
二是物理解决,增大物理内存,然后通过调整 JVM 的参数来调整内存的大小。 JVM 内存溢出类型有两种:java.lang.OutOfMemoryError: PermGen space 和 java.lang.OutOfMemoryError: Java heap space。PermGen space ...
该文档描述了开发测试环境中Docker及JVM内存限制部署方案
在调整 Tomcat 的内存设置之前,我们需要了解一些基本的 JVM 内存参数: 1. **`-Xms`**:设置 JVM 启动时的初始堆内存大小。 2. **`-Xmx`**:设置 JVM 运行时的最大堆内存大小。 3. **`-Xmn`**:设置年轻代 (Young ...
本文将深入探讨JVM内存参数调优的相关知识点,帮助开发者更好地理解并掌握如何优化JVM的内存设置。 #### JVM内存概述 JVM内存主要分为以下几个部分: 1. **堆内存(Heap Memory)**:用于存储对象实例、数组等...
- `-XX:SurvivorRatio`:这个参数设定Eden区与Survivor区的大小比例。例如,`-XX:SurvivorRatio=8` 表示每个Survivor区是Eden区大小的1/8。合适的比例能减少Full GC的发生。 4. 垃圾收集器选择: - `-XX:+...
4. JVM内存参数大小的设置需要根据实际应用的负载和资源需求来调整。以日均百万级订单交易系统为例,我们需要考虑系统的并发量、对象生命周期、GC策略等因素。如文中所述,随着订单量的增加,可能需要增大堆内存以...
### JVM内存配置优化 #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组...
- 合理设置JVM参数,如-Xms、-Xmx等。 - 适时使用软引用、弱引用等减少内存消耗。 - 对于大对象,考虑使用对象池技术复用。 #### 八、Java性能监控与调优 Java性能监控是评估和提高Java应用程序性能的重要工具...
5. **JVM配置调整**:JProfiler11还可以提供JVM参数建议,帮助开发者正确设置JVM初始堆大小、最大堆大小、内存池等关键参数,确保应用程序稳定运行。 在实际使用中,JProfiler11的详细报告和可视化界面使得问题定位...
本文档涉及Java虚拟机(JVM)的堆内存分配和管理,以及相关的JVM内存设置参数。堆内存是Java中用于存储对象实例的区域,它在JVM内存模型中占据核心位置。在深入理解堆内存结构及其设置参数之前,我们需要明确几个...
本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并解析给定代码片段中的关键概念。 ### JVM内存模型 在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存...
JVM内存管理主要包括内存结构、内存分配以及垃圾回收(GC)等方面。了解这些知识对于优化Java应用程序的性能至关重要。 ### 1. JVM内存结构 #### 1.1.1 JVM内存概述 JVM内存分为几个关键区域,每个区域都有特定的...
特别是在大数据处理场景下,合理设置JVM内存参数显得尤为重要。本文将深入探讨JVM内存管理的基础概念、内存设置方法及其调优策略,以帮助开发者避免常见的`java.lang.OutOfMemoryError`异常,提升应用性能。 #### ...
JVM内存模型详解 JVM内存模型是Java虚拟机(JVM)中的一种内存管理机制,它将内存区分为永久区内存(Permanent space)和堆内存(heap space)两大块。永久区内存用于存放加载的Class类级对象,如class本身、method...
- **线程栈大小**:`-Xss`参数设定每个线程的栈大小。 - **内存使用率控制**:`XX:MinHeapFreeRatio`和`XX:MaxHeapFreeRatio`分别设定内存使用率低于和高于特定值时进行内存收缩或扩张的阈值。 - **垃圾收集器...