首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OutOfMemoryError

OutOfMemoryError
EN

Stack Overflow用户
提问于 2013-05-14 04:58:35
回答 2查看 183关注 0票数 1

我正在做一个课程表作为最后一年的项目。在过去的两天里,我得到了一个OutOfMemoryException。我读了很多关于这个异常的文章,并尝试通过-Xms和-Xmx选项增加分配的内存。这些似乎都不适合我。

我分析了该项目,发现哈希图对象和MySQL连接占用了最大空间。我使用了一个静态连接,如下所示

代码语言:javascript
复制
public final class Connector
{
private static Connector connector;
Connection con;
String driverName;
String dbname;
String username;
String password;
String connString;

private Connector(){
    driverName = "com.mysql.jdbc.Driver";
    dbname = "timegen";
    username = "root";
    password = "root";
    connString = "jdbc:mysql://localhost:3306/" + dbname;
    openConnection();
}

public void openConnection(){
    try{
        Class.forName(driverName);

        con = DriverManager.getConnection(connString, username, password);
    } catch(Exception e){
        System.out.println(e);

    }
}


public void terminateConnection(){
    try{
        con.close();
    } catch(Exception e){
        System.out.println(e);
    }

}

public static Connector createConnection() {

    if (connector == null){
        connector = new Connector();
    }

    return connector;
}

public Connection getCon() {
    return con;
}
public String getConnString() {
    return connString;
}

public void setConnString(String connString) {
    this.connString = connString;
}

}

这是名为MasterData的类的代码,它由访问数据库的所有其他类扩展

代码语言:javascript
复制
public class MasterData{
    static Connector con;
    static Statement st;

    MasterData(){
    try {
        con = Connector.createConnection();
        st = con.getCon().createStatement();
    } catch (SQLException ex) {
        Logger.getLogger(MasterData.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    public Statement createStatement() throws SQLException{
        Statement st = con.getCon().createStatement();
        return st;       
    }
    public void closeConnection(){
        con.terminateConnection();
    }


}

一个使用此方法的类的示例

代码语言:javascript
复制
public class Teacher extends MasterData{

int teacherid;
String teachername;
String subject;
String post;

@Override
public String toString() {
    return "Teacher{" + "teacherid=" + teacherid + ", teachername=" + teachername + ", 
post=" + post + ", subject=" + subject + '}';
}



public Teacher(int teacherid, String teachername,String subject, String post) {
    this.teacherid = teacherid;
    this.teachername = teachername;
    this.subject = subject;
    this.post = post;
}

public Teacher(String teachername) {
    this.teachername = teachername;
}

public Teacher(){}

public String display(){

    String s ="\nTeacher name = " + teachername
            + "\nSubject = " + subject
            + "\nPost = "+post;
    return s;
}


public ArrayList<String> getSubjectTeachers(String s){
    ArrayList<String> teachers = new ArrayList<String>();
    try{
        ResultSet rs = st.executeQuery("select teachername from teacher where 
subject='"+s+"';");
        while(rs.next()){
            teachers.add(rs.getString(1));
        }
    }catch(Exception e){e.printStackTrace();}

    return teachers;
}

public List<Teacher> getFree()
{
   List<Teacher> lst = new ArrayList<Teacher>();
   try{
       ResultSet rs = st.executeQuery("select * from teacher where teacherid not 
in(select classteacher from division where classteacher!=null)");
       while(rs.next())
       {
            lst.add(new 
 Teacher(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4)));
       }

   }catch(Exception e ){e.printStackTrace();}
   return lst;
}




public int getTeacherid() {
    return teacherid;
}

public void setTeacherid(int teacherid) {
    this.teacherid = teacherid;
}

public String getTeachername() {
    return teachername;
}

public void setTeachername(String teachername) {
    this.teachername = teachername;
}


public String getSubject() {
    return subject;
}

public void setSubject(String subject) {
    this.subject = subject;
}

public String getPost() {
    return post;
}

public void setPost(String post) {
    this.post = post;
}

public boolean checkDuplicate(){
    try{
        ResultSet rs = st.executeQuery("select * from teacher where 
teachername='"+teachername+"';");
        if(rs.next())
            return true;

    }catch(Exception e){e.printStackTrace();}

         return false;

}

public boolean insert(){
    int t;
    try{
        t = st.executeUpdate("insert into teacher(teachername,subject,post)     
values('"+teachername+"','"+subject+"','"+post+"');");
        if(t!=0) return true;
    }
    catch(Exception e){
        e.printStackTrace();
        return false;

    }
    return false;
}


public boolean delete(){
    int t;
    try{
        new AssignedTeacher().deleteTeacher(teacherid);
        t = st.executeUpdate("delete from teacher where teacherid="+teacherid+";");
        if(t!=0) return true;
    }
    catch(Exception e){
        e.printStackTrace();
        return false;

    }
    return false;
}

public boolean update(){
    int t;
    try{
        t = st.executeUpdate("update teacher set teachername = '"+teachername+"',                  
subject='"+subject+"', post='"+post+"' where teacherid="+teacherid+";");

        if(t!=0) return true;
    }
    catch(Exception e){
        e.printStackTrace();
        return false;

    }
    return false;
}

}

我的目的是为整个程序创建一个单一的静态连接。它似乎工作得很好。但这是问题的可能原因吗?

EN

回答 2

Stack Overflow用户

发布于 2013-05-14 05:03:45

看起来您创建了太多Connection%s。

你可以在你的openConnection方法中验证你的连接是否is valid,你也可以使用一些Connection Pool

编辑:

在我看来,您尝试实现Active record pattern是因为有insertdeleteupdategetSubjectTeachers方法。无论如何,这对extend Teacher from MasterData来说并不总是一个好主意。作为一个副作用,将为每个MasterData实例创建新连接。static Connection con将被重新分配给新对象,但以前的连接将永远不会关闭。MasterData#createStatement也是如此。

此外,正如greedybuddha指出的那样,确保您的HashMap不会以相同的方式重新分配。

票数 0
EN

Stack Overflow用户

发布于 2013-05-14 07:25:03

同时尝试设置这些参数:

代码语言:javascript
复制
-XX:PermSize
-XX:MaxPermSize
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16531016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档