在开发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
分享到:
相关推荐
该文档描述了开发测试环境中Docker及JVM内存限制部署方案
一、JVM整体结构及内存模型 二、JVM内存参数设置 三、逃逸分析
jvm优化;
第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...
要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。 -Xms:初始值 -Xmx:最大值 -Xmn:最小值 解决办法: 修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\...
这是对JVM内存有关的一点小笔记,希望对大家有帮助,存在不足与错误的地方,请大家多多包涵,多多指教。java
Linux服务器: 在/usr/local/apache-tomcat-5.5.23/bin 目录下的catalina.sh 添加:JAVA_OPTS=’-Xms512m -Xmx1024m’ 或者 JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:MaxNewSize=256m” 或者 CATALINA_OPTS=”-...
你对Eclipse中JVM内存设置方法是否熟悉,这里通过几个问题向大家解释一下,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JRE。
JVM参数设置详细说明、JVM 参数设置详细说明 1: heap size a: -Xmx 指定jvm的最大heap大小,如:-Xmx=2g b: -Xms 指定jvm的最小heap大小,如:-Xms=2g,高并发应用,建议和-Xmx一样,防止因为内存收缩/突然增大带来...
JVM性学习笔记-基本原理,内存模型,JVM参数设置,类加载器原理,JDK自带工具
这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将-Xmx 和-XX:MaxPermSize 都设置为512M 之后Eclipse 可以启 ...3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?
但我们怎么知道服务器启动时,到底JVM内存相关参数的值是多少呢。 在实践中,经常遇到对JVM参数进行设置了,并且自己心里觉得应该不会出现内存溢出了;但不幸的是内存溢出还是发生了。 很多人百思不得其解,那我可以...
JVM的内存机制,几个重要的参数设置,提高程序运行效率。
参数 | 解释内存类|-Xss: | 指定线程栈大小,默认是1M-Xms: | 指定jvm初始堆大小-Xmx: | 指定jvm最大可用内存-Xmn:| 设置新生
在使用MyEclipse的过程中经常出现内存不足的提示: MyEclipse has detected that less than 5% of the 31MB of Eden Space (Heap memory) space remains. It is strongly recommended that you exit and restart ...
介绍常用的JVM参数,包括内存分配、堆栈分配、虚拟机运行模式以及调试跟踪参数。 第四课 GC的算法和种类 引用计数 标记清除 复制算法 标记压缩 可触及性 本章是理论性较强的一章,主要介绍GC的基本算法和思想,本...
一.java内存结构 2 二 垃圾收集算法: 3 三 JVM参数 4 四 JVM的垃圾回收集器 7 五 常用参数设置 7
JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 ...JVM调优:命令行指令,设置堆内存大小的参数
- 掌握jvm的运行参数以及参数的设置 - 掌握jvm的内存模型(堆内存) - 掌握jamp命令的使用以及通过MAT工具进行分析 - 掌握定位分析内存溢出的方法 - 掌握jstack命令的使用 - 掌握VisualJVM工具的使用 - 了解什么是...