全国热线

400-080-3312

全国监督服务热线:9:00-23:00

Java中不健壮代码是怎样产生的,该如何解决

java中不健壮代码时怎样产生的,该如何解决这个问题呢?南京学码思java培训机构​老师介绍,不健壮代码是由于JVM内存溢出所导致的,该如何解决,具体如下。

关于java中的不健壮代码,有些java行业新手还不是很了解,甚至有人还没听说过这个概念,到底java中不健壮代码时怎样产生的,该如何解决这个问题呢?南京学码思java培训机构老师介绍,不健壮代码是由于JVM内存溢出所导致的,该如何解决,具体如下。

Java中不健壮代码是怎样产生的,该如何解决

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的错误,用top命令看看进程使用情况,发现内存不足2M,花了很长时间,发现是jspsmartupload的问题。把jspsmartupload组件的源码文件(class文件)反编译成Java文件,如梦方醒:

m_totalBytes = m_request.getContentLength();

m_binArray = new byte[m_totalBytes];


变量m_totalBytes表示用户上传的文件的总长度,这是一个很大的数。如果用这样大的数去声明一个byte数组,并给数组的每个元素分配内存空间,而且m_binArray数组不能马上被释放,JVM的垃圾回收确实有问题,导致的结果就是内存溢出。


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 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。


看到这里,相信大家对于java不健壮代码的出现及解决方法已经有所了解了。作为职场新人,需要学习和理解的概念还有很多,如果你还有什么不懂的或是想获得更多免费java教程的话,可以直接咨询南京学码思java培训机构在线老师,也欢迎大家前来实地考察,免费试听学码思java培训课程。


上一篇:Java和C/C++的编译过程有什么不同
下一篇:Java编程时你需要遵循这几个原则

相关推荐

免费试听 | 学费咨询 | 在线报名 | 申请补贴 | 软件培训 | 网站地图

2016-2020 南京学码思教育科技有限公司 .All Rights Reserved

苏ICP备16033487号 www.njxms.com.cn

全国热线

400-080-3312

全国监督服务热线:9:00-23:00