最近我公司的网站,服务器时间长了,访问量变大.就会报内存溢出.找不到原因.
在网上搜索了很多资料.关于java内存泄露方面的东西.我怀疑是我们java类中用了单例模式惹的祸.但还不敢确定. 我对单例模式,也只懂得一二.希望各位网友.可以讨论讨论.我希望能尽快找到解决方法.
下面是我在网上搜索的一个关于单例模式,有内存泄露的帖子:http://java.csdn.net/page/bf856ae4-ef93-4355-b43d-3735cba92279
大概意思:
单例模式。不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露,考虑下面的例子:
class A{
public A(){
B.getInstance().setA(this);
}
....
}
//B类采用单例模式
class B{
private A a;
private static B instance=new B();
public B(){}
public static B getInstance(){
return instance;
}
public void setA(A a){
this.a=a;
}
//getter...
}
显然B采用singleton模式,他持有一个A对象的引用,而这个A类的对象将不能被回收。想象下如果A是个比较大的对象或者集合类型会发生什么情况。
我再贴出我项目中的java代码(提取出来的).供大家分析.
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.Logger;
import com.viewbean.Mms;
public class MyDBTest {
Statement stmt= null;
ResultSet res = null;
private static final Logger logger = Logger.getLogger(Mms.class);
private static final MyDBTest instance = new MyDBTest();
public static MyDBTest getInstance() {
return instance;
}
private MyDBTest() {
}
/**
*
* @param con
* @param a
* @param b
* @param c
* @param i 调用sql语句的序号.
* @return
*/
public String[][] getOs(java.sql.Connection con,String a,String b ,String c,int i ){
logger.debug("获取某某...");
String[] sql={
// 0.
"select a from mysql where a ='"+b+"'",
//1.
"select a from mysql where b ='"+b+"'",
//2.
"select a from mysql where c ='"+c+"'"
// sql语句都是 用 + 号拼起来的.
};
try {
stmt = con.createStatement();
res= stmt.executeQuery(sql[i]);
//................
//对res进行其他操作.返回一个String[][]二维数组
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(stmt!=null)
stmt.close();
if(res!=null)
res.close();
//con 连接对象.在jsp中被关闭.
} catch (SQLException e) {
e.printStackTrace();
}
sql=null;
}
return null;//实际返回二维数组.现在模式返回null;
}
public boolean deleteGif(java.sql.Connection conn,String aa) {
logger.debug("删除某某...");
return false;
}
public void insertmms(java.sql.Connection con,String linkid,String id){
logger.debug("添加某某...");
}
}
由于是一个网站项目,没有很复杂的框架.应用了简单的jsp+javabean模式开发.
所以都是在jsp或者servlet中创建连接对象.然后调用这些java类.并且这些类都应用了单利模式.
其他的jsp直接调用getInstance()方法.然后调用其中的方法.执行sql操作.并且连接对象是在jsp中try{}catch{}finally{}
finally{}里中关闭里.所有jsp中的对象和String,String[][]都设置为null.
现在我的疑问就是:1.向我这种代码.javabean设置为单例模式,会不会有内存泄露的结果.
2.我那是用了logger4j的对象,始终没有清空他.他应不应该进行logger =null 操作.
3.还有拼sql 语句.有没有跟好的方法.
4.在finally{} 将对象置为null ,是不是真的内存回收了呢?
分享到:
相关推荐
7、把某些集合放到了 Session/Application 里面了,这样,如果 Session 不过期,他们占用内存就不会释放。 在使用 Session 或 Application 时,应该避免把集合放到其中,以免内存溢出。 8、程序里不可避免大量使用...
本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了...本资源解决的难题是导入大文件excel的时候,会报内存溢出的错误。 欢迎各位下载,解决用户的难题是我的宗旨,好的话给个评价,谢谢!
在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...
总之,HeapAnalyzer456.jar是Java开发中不可或缺的内存诊断工具,通过它可以深入剖析内存溢出的原因,从而提高应用的稳定性和性能。对于新手来说,掌握这个工具的使用方法,对提升解决问题的能力大有裨益。
### JBoss内存溢出原因分析 #### 一、概述 JBoss是一款开源的应用服务器,它支持多种企业级应用,如EJB(Enterprise JavaBeans)、JMS(Java Messaging Service)、JPA(Java Persistence API)等。在运行过程中,...
在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...
内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...
Python内存管理是一个重要的主题,尤其是对于那些运行长时间后台服务的开发者而言。虽然Python有内置的垃圾回收机制,但仍然可能出现内存泄漏和内存溢出的问题,影响程序的稳定性和效率。 **一、Python内存泄漏** ...
### Apache服务器出现内存溢出的解决方法 #### 知识点概述 本文主要探讨了Apache服务器在运行过程中遇到内存溢出问题的几种常见情况及其解决办法。虽然标题提及的是Apache服务器,但文中实际讨论的是与Apache...
内存溢出问题是参加kaggle比赛或者做大数据量实验的第一个拦路虎。 以前做的练手小项目导致新手产生一个惯性思维——读取训练集图片的时候把所有图读到内存中,然后分批训练。 其实这是有问题的,很容易导致OOM。...
1. **内存溢出概述**:内存溢出(Out Of Memory,OOM)是Java应用中常见的问题,当应用程序请求的内存超过了JVM分配的内存空间时,就会出现这种情况。对于WebSphere来说,这可能表现为服务器崩溃、应用程序响应缓慢...
针对读取、生成excel内存溢出问题,包括工具类和具体的实现
当内存剩余不到 40 %时,JVM 会增大堆到 Xmx 设置的值,当内存剩余超过 70 %时,JVM 会减小堆到 Xms 设置的值。 垃圾回收 GC 的角色是在 JVM 中调用垃圾回收的机制。GC 的触发机会增加 GC 的触发机会。为了避免...
当程序运行时分配给它的内存空间不足以支撑其正常运行时,就会出现“内存溢出”(Out of Memory Error,简称OOM)。这通常发生在堆内存或方法区等内存区域耗尽时。对于Java应用而言,了解如何有效识别并解决内存溢出...
在C++中,程序员需要手动分配和释放内存,如果没有正确地释放已分配的内存,就会出现内存泄漏,长期累积可能导致内存溢出。 Qt库中提供了智能指针(如QPointer、QSharedPointer)和对象所有权(如QObject的parent-...
#### 一、理解内存溢出的原因 内存溢出通常发生在应用程序消耗了超出虚拟机所能分配的最大堆内存空间的情况下。在JDBC中,这通常是因为一次性加载过多的结果集到内存中导致的。例如,当执行SELECT * FROM table_...
6. **升级或切换版本**:如果Jetty 8的内存溢出问题难以解决,可以考虑升级到更稳定或内存管理更优化的版本,如Jetty 9或更高版本,或者考虑使用其他Web服务器,如Tomcat。 7. **使用G1垃圾收集器**:G1(Garbage ...
PIO 导入大量数据时的解决内存溢出问题 PIO 是一个 Java 库,用来读取和写入 Microsoft Office 文档,如 Excel、Word 等。然而,在导入大量数据时,PIO 经常会出现内存溢出的问题。这种情况下,我们需要找到一种...
确保这个值不超过服务器物理内存的70%以防止操作系统因交换页面而变慢。 2. **优化Kettle步骤配置**:如问题描述中所述,降低表输出步骤的“提交记录数量”,分批处理数据可以减少内存压力。此外,还可以考虑使用...