`

java陷阱-------内存溢出

    博客分类:
  • J2SE
阅读更多
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
所以我们应该明确:存在内存溢出的因不一定导致内存溢出的果。。。


1。JAVA操作文本文件为什么超过3万行就内存益处啊?

PrintWriter  out  =  new  PrintWriter(new  BufferedWriter(new  FileWriter(fileName)));  
          //PrintWriter  out  =  new  PrintWriter(fileName);  
          //FileOutputStream  out  =  new  FileOutputStream(fileName);  
    
            while  (rs.next())  {  
              for  (int  j  =  1;  j  <=  totalColumn;  j++)  {  
                  out.write(rs.getObject(j).toString());  
                  out.write("\t");  
              }  
                out.write("\n");  
                out.flush();  
    
                      }  
  }  
  我在代码中  写了  out.flush()用来刷新该流的缓冲;  可是当我的记录数超过3W时就报了内存益处的问题了,难道JAVA不能边读边写吗?还是out这个对象随着指向的fileName文件的边大占用内存也大了吗??到底怎么来实现用JAVA写更多的数据而不内存益处呢


答案是:就在while(rs.next())  当rs.next()时内存不断增大,而不是写流的问题,JAVA的ResultSet真是麻烦,而且ResultSet还不能clone();  所以记得在做项目的时候,经常要设置:jdbc.setMaxRows(100*10000);  //设置能容纳100万行记录-----这个就是防止内存泄露的哈------------------- 内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 
jdbc.setQueryTimeout(60*30); //设置超时时间是30分钟


2。java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
 public class Stack { //长生命周期
    private Object[] elements=new Object[10]; //当数组容器中没有东西时是无用的,但是无法回收~~elements是短生命周期
    private int size = 0;
    public void push(Object e){
    ensureCapacity();
    elements[size++] = e;
    }
    public Object pop(){
    if( size == 0)
throw new EmptyStackException();
//这里还是引用了,只是指针变位置变化而已,他确实返回了那个对象,但是他却没有断开那个对象的引用,也就是说有两个地方会持有这个对象的引用,调用pop的地方,和elements中
    return elements[--size]; 
    }
    private void ensureCapacity(){
    if(elements.length == size){
    Object[] oldElements = elements;
    elements = new Object[2 * elements.length+1];
    System.arraycopy(oldElements,0, elements, 0, size);
    }
    }
    }
    上面的原理应该很简单,假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件(必要条件):无用,无法回收。
   例子1
    public class Bad{
    public static Stack s=Stack();
    static{
    s.push(new Object());
    s.pop(); //这里有一个对象发生内存泄露
    s.push(new Object()); //上面的对象可以被回收了,等于是自愈了,因为引用被覆盖了
    }
    }
    因为是static,就一直存在到程序退出,但是我们也可以看到它有自愈功能,就是说如果你的Stack最多有100个对象,那么最多也就只有100个对象无法被回收其实这个应该很容易理解,Stack内部持有100个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,以前的引用自然消失!

内存泄露的另外一种情况:当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。


这是属于: 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3。代码中存在死循环或循环产生过多重复的对象实体;

4。启动参数内存值设定的过小;

分享到:
评论

相关推荐

    java陷阱常见面试题

    Java语言在实际应用中充满了各种陷阱,这些陷阱可能在...通过深入理解和实践这些Java陷阱,不仅可以避免在编程中犯错,也能在面试中展现出专业技能,为你的职业生涯加分。不断学习和探索,使你在Java的世界里游刃有余。

    Android防止内存溢出浅析

    在Android开发中,防止内存溢出是一个至关重要的任务,因为Android设备的内存资源相对有限,尤其是在Dalvik虚拟机中,其最大堆大小通常只有16MB。本文将深入探讨Android平台上的内存管理机制,以及如何避免内存泄露...

    java-puzzlers-sampler_java_Joshua_

    不正确地使用它们可能导致内存溢出或者运行时错误。 5. **异常处理**:Java强制使用`try-catch-finally`块处理异常,但错误的异常处理策略可能导致程序逻辑混乱,例如不恰当的异常捕获和处理,或者在`finally`块中...

    Java陷阱一箩筐笔试题

    Java编程语言中包含了许多陷阱和细节,这些都是面试官在寻找潜在候选人时经常提出的知识点。以下是一些关于Java面试题的详细解释: 1. **final, finally, finalize的区别**: - `final` 用于声明不可变变量、表示...

    java问题定位技术+性能优化

    - 通常建议不超过2GB,避免内存溢出。 - **3.5.3 特殊场合下JVM参数调优** - 针对不同的应用场景调整JVM参数,如使用G1垃圾回收器。 - **3.5.4 Java完全垃圾回收** - 使用`System.gc()`强制触发垃圾回收,但不推荐...

    Java OCA 考试指南带highlight

    - 深入理解Java内存模型,特别是在多线程环境下对变量的访问和修改。 考生在准备Java OCA考试时,应重点学习以上知识点,深入理解概念并能够解决实际编程问题。同时,参考指南书中的重点和易错点,对于提高考试通过...

    Java面试中的陷阱

    ### Java面试中的陷阱详解 #### 一、final, finally, finalize 的区别 1. **final**:在Java中,`final`是一个关键字,用于声明一个不可更改的对象或变量。如果一个类被声明为final,那么它不能被继承;如果一个...

    【IT十八掌徐培成】Java基础第02天-02.字节-负数表示-补码-128计算.zip

    在Java中,进行128的计算时,需要确保变量的类型足够大,比如使用`int`或`long`,以避免数据溢出。如果你尝试将128赋值给一个`byte`类型的变量,编译器会报错,提示你可能的数据溢出。因此,理解字节大小和数据类型...

    Java 自动转换的资源

    字符在内存中以Unicode编码存储,因此可以直接用 `char` 变量参与整数运算,或者通过 `(char)intValue` 将整数转换为字符。 7. **字符串转换**: - 使用 `Integer.parseInt()` 或 `Integer.valueOf()` 方法可以将...

    IT职场:程序员Java面试中的陷阱

    了解这些知识有助于分析和解决问题,例如,如何通过JVM参数调整来优化应用性能,或者如何定位和解决内存溢出问题。 工具的使用也是Java开发者必备技能之一。面试官可能询问你是否熟悉常用的开发工具,如IDEA、Git、...

    java解惑(源代码+教程)

    1. **类型转换与数据溢出**:Java中整型数据之间的转换可能导致数据溢出,这在处理数值运算时必须小心。例如,将大整数强制转换为较小类型会导致数据丢失。 2. **自动装箱与拆箱**:Java 5引入了自动装箱和拆箱机制...

    Java An Introduction to Problem Solving and Programming

    - **引用**:指向对象的内存地址。 - **区别**:对象是实际存在的实体,而引用则是对象的别名。 #### 4. 类型参数探究(第345页) - **概念**:在方法签名中使用类类型的参数。 - **应用场景**: - 处理复杂的对象...

    Java.Bug模式详解

    理解Java内存模型,合理设置堆大小,避免创建过大的对象,及时清理不再使用的对象,使用WeakReference和SoftReference管理对象,可以帮助防止内存溢出。 以上仅是部分常见的Java Bug模式,实际开发中还会有更多复杂...

    Java十大低级错误

    Java编程中的十大低级错误是每位开发者应当避免的常见编程陷阱。这些错误不仅影响代码的可读性,还可能导致程序运行时出现异常或性能下降。以下是对这些错误的详细解释和改进建议: 1. **命名不规范**:方法和变量...

    JAVA基础易错总结(50%你不知道)

    大鹏的"JAVA基础易错总结"涵盖了这些重要的知识点,并且可能还揭示了一些鲜为人知的陷阱。通过深入学习和实践,开发者可以避免这些常见错误,提升Java编程的水平。希望这份资料能成为你Java学习旅程中的宝贵财富。

    ieee-std-754-2019.pdf

    IEEE 754-2019保持与前一版本的向后兼容性,同时增加了新的特性,如半精度(Half-Precision)格式,用于节省内存和提高计算效率,以及四精度(Quad-Precision)格式,用于更高级别的精度需求。 6. **软件支持** ...

    Java使用SNMP4J实现snmp trap接口发送消息_20170808_LK

    当网络设备发生特定事件时,如接口故障、内存溢出等,设备会自动向预设的管理站发送Trap消息,以便管理员能及时了解并处理问题。本文将详细讲解如何使用Java的SNMP4J库来实现SNMP Trap接口,发送这些消息。 首先,...

    JAVA.BUG模式详解

    在Java编程中,"BUG模式"通常指的是程序员在编写代码时容易犯的一些常见错误或陷阱,这些错误可能导致程序运行不正常、性能下降甚至系统崩溃。理解并避免这些BUG模式是提高Java程序质量和效率的关键。本篇文章将深入...

    java面试——Redis面试专题.zip

    7. Redis缓存策略:包括LFU(Least Frequently Used)、LRU(Least Recently Used)和TTL(Time To Live)等,用于管理内存空间,避免内存溢出。 8. 消息队列:Redis的发布/订阅(Pub/Sub)模式可以作为轻量级的消息...

    java 反模式 卷3 pdf

    这些框架的反模式也是重要的学习内容,例如,不合理的Struts配置可能导致性能瓶颈,而滥用Hibernate的懒加载可能导致内存溢出。 "Java培训 J2EE培训 DOTNET培训 - 51培训网.url"进一步表明,这本书不仅适用于有经验...

Global site tag (gtag.js) - Google Analytics