CSDNRGY 2017-02-22 09:05 采纳率: 88.2%
浏览 2000
已采纳

如何测试能判断Java代码,是否存在内存泄漏的问题?

我自己封装了一个jdbc的包

如何能判断出,我这段代码是否存在内漏泄漏的情况

 /**
 * oracle jdbc
 * @author rgy
 *
 */
public class OracleJdbc {

    private Connection conn;
    private ResultSet rs;
    private ResultSetMetaData md;
    private PreparedStatement ps;
    private Properties prop;
    private String url;
    private String user;
    private String psw;
    private List<Map<String,Object>> list;
    private Map<String,Object> map;
    private Integer flg;
    private FileInputStream fis;
    private String path = "src/orcl.properties";

    //测试代码
    public static void main(String[] args)  {
        OracleJdbc oracle = new OracleJdbc();
        try {
            String sql = "select * from GC_EXAMTYPE t where t.examtype_id= ?  or examtype_id=?";
            List<Map<String, Object>> query = oracle.query(sql,5,6);
            System.out.println(query);
            String inser_sql = "insert into test (id, name) values (?, ?)";
            Integer add_flg = oracle.add(inser_sql, 2,2);
            System.out.println(add_flg);
            String mod_sql = "update test set name = ? where id=?";
            Integer mod_flg =oracle.mod(mod_sql, 2,1);
            System.out.println(mod_flg);
            String del_sql = "delete test where id=?";
            Integer del_flg =oracle.del(del_sql, 1);
            System.out.println(del_flg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 连接数据库
     * @throws Exception
     */
    public void open(){
        try {
            fis = new FileInputStream(path);
            prop = new Properties();
            prop.load(fis);
            url = prop.getProperty("db.url");
            user = prop.getProperty("db.user");
            psw = prop.getProperty("db.password");
            Class.forName(prop.getProperty("driverClass"));
            conn = DriverManager.getConnection(url, user, psw);
        } catch (IOException | ClassNotFoundException | SQLException e) {
            close(conn,ps,rs);
        }
    }
    /**
     * 关闭连接
     */
    public void close(Connection conn,PreparedStatement ps,ResultSet rs) {
        try {
            if(ps!=null) ps.close();
            if(rs!=null) rs.close();
            if(conn!=null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
    /**
     * 执行dml语句
     * @param sql dml语句
     * @param objs 参数
     * @return 0失败 1成功
     * @throws SQLException sql异常
     */
    public int dml(String sql, Object... objs) {
        open();
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < objs.length; i++) {
                ps.setObject(i+1, objs[i]);
            }
            flg = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(conn,ps,rs);
        }
        return flg;
    }
    /**
     * 执行查询语句
     * @param sql 查询语句
     * @param objs 参数
     * @return 查询结果
     */
    public List<Map<String,Object>> query(String sql,Object...objs){
        open();
        list = new ArrayList<>();
        try {
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < objs.length; i++) {
                ps.setObject(i+1, objs[i]);
            }
            rs = ps.executeQuery();
            md = rs.getMetaData();
            while (rs.next()) {
                map = new HashMap<>();
                for (int i = 1; i <= md.getColumnCount(); i++) {
                    String key = md.getColumnName(i);
                    Object value = rs.getObject(i);
                    map.put(key, value);
                }
                list.add(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(conn,ps,rs);
        }
        return list;
    }
    /**
     * 添加数据
     * @param sql 添加语句
     * @param objs 参数
     * @return 0失败 1成功
     */
    public int add(String sql,Object...objs) {
        flg = dml(sql, objs);
        return flg;
    }
    /**
     * 修改数据
     * @param sql 修改语句
     * @param objs 参数
     * @return 0失败 1成功
     * @throws SQLException sql异常
     */
    public int mod(String sql,Object...objs){
        flg = dml(sql, objs);
        return flg;
    }
    /**
     * 删除数据
     * @param sql 删除语句
     * @param objs 参数
     * @return 0失败 1成功
     */
    public int del(String sql,Object...objs){
        flg = dml(sql, objs);
        return flg;
    }
}
  • 写回答

3条回答 默认 最新

  • 皓皓皓的部落格 2017-02-22 09:27
    关注

    内存泄漏,其实说简单点,就是手机内存都是有限的,当你的应用切出界面了,或者通过别的方式方法不在手机当前界面了,系统有个垃圾回收机制,会把你的应用中不同的页面或者service服务当做垃圾回收,但是如果你的应用中写了有关于网络加载的代码,系统就不会消除你的页面,导致该消除没消除,你的那个代码页面就会占用系统的内存,系统内存被占用的多了,就卡,导致死机。。。。说的不好 见谅

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 帮我调试idea基于spring boot项目
  • ¥15 es 7.17.20版本生成时间戳
  • ¥15 wpf dategrid表头排序图标自定义
  • ¥15 分析下图所示同步时序逻辑电路的逻辑功能。
  • ¥15 halcon联合c#遇到了问题不能解决
  • ¥15 xshell无法连接提示ssh服务器拒绝密码
  • ¥15 AT89C52单片机C语言关于串口通信的位操作
  • ¥20 需要步骤截图(标签-服务器|关键词-map)
  • ¥50 gki vendor hook
  • ¥15 灰狼算法和蚁群算法如何结合