A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 16463535 中级黑马   /  2013-4-13 10:46  /  1305 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 16463535 于 2013-4-14 08:58 编辑

当学过毕老师的IO后,知道自定义缓冲区可以导致内存溢出;学过张老师高新技术,知道修改已经存储后的HashSet,时间久了,容易内存溢出。那么当JVM运行时,加载类文件的时候,需要加载到内存。如果一个很大的项目,涉及到的java类特别多,能否导致内存溢出?固然有JVN的垃圾回收机制,但垃圾回收机制是随机的,不定时,在某一时刻当垃圾回收机制没有启动的时候,加载特别多的类文件,能否导致我们的java程序内存溢出?一定要设想到这样的最坏的场景。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
看了你这问题后, 我也去了解了下。查了相关资料。确实是个大问题,,
回复 使用道具 举报
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的方式解决。

  5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
  6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃
  7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。


网上摘要,希望对你有帮助。
回复 使用道具 举报
毕老师,那玩的是 内存溢出  个人觉得很危险
张老师,人玩的是 内存泄露  感觉问题不大哈
具体的定义和示例,以及怎么避免
多在网上去找点资料吧
我觉得多去了解一下就可以了
java既然提供了垃圾回收机制,那么就是为了让我们这些coder活得更轻松一些
所以,没必要过多的去在意 内存泄露 的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马