大型项目中的套接字和打印编写器可能发生内存泄漏

时间:2019-04-23 23:07:11

标签: java sockets memory-leaks printwriter

好吧,我将尝试以更好的方式解释这个问题,这是我大学毕业后的第一份工作,我像JR Java程序员一样开始工作,而我的第一个任务是更新一个大项目,该项目有效很好,他们只需要在每种方法中都记录一个日志即可将所有重要步骤保存在文本文件中。 基本上,该项目是一种提供公钥的HSM硬件,用户可以使用该密钥在应用程序安装在服务器上时通过正在运行的套接字加密和解密数据,摘要数据,验证证书以及其他方法,我添加了一个登录到每种方法,但是在我们释放应用程序的那一刻,该应用程序消耗了大部分内存,而该应用程序没有释放内存,因此每次增加的内存都会增加。 对于日志记录器,我使用了打印写作者,而且我不能像我希望的那样自由编程,也没有获得修改所有代码的权限,我的第一个解决方案是在每种方法中打开一个本地打印编写器变量,然后为它添加try-catch我认为这是最好的解决方案,但该方法中的所有指令都必须关闭打印,但主管告诉我,打印作家必须在调用时像参数一样发送,这是接受请愿书的类:

我确定我已关闭所有打印,因为我可以在日志中看到结果,所以我不知道问题出在哪里,我试图在该方法中创建打印,但失败了,我试图关闭在catch子句中打印,它关闭,但内存继续增长。 通过几次请愿,该应用程序将占用5 MB,并且该应用程序每天应该收到更多请愿书! 这是接受请愿书的类,首先处理用户发送的数据并创建与BD的连接,然后使用DB给定的ID为该请愿书创建日志,如果该方法返回,则每个日志文件都有一个唯一的ID。一个很好的请求“ satisfactorio”,文件的结尾被重命名为“ s”,我的职责是仅添加日志,我无法修改其他内容,但是如果您告诉我该怎么办,我可以告诉我的导演在哪里代码错误,然后对其进行修改。

public class TProcess extends Thread {    
private java.net.Socket socket = null;
public static java.security.PrivateKey InePrivateKey = null;
public static java.security.cert.X509Certificate IneCertificate = null;
public static String NameServer = "Server1";
public static java.security.Provider HmsProvider = null;
public static com.ncipher.km.nfkm.SecurityWorld SecurityWord = null;
public static TKeyProperties[] KeysProperties = null;
public static int[] Modules = null;
public static String PathLog = "";
    public static String PathLicense = "";
    public static String ActiveLog = "";
    public static String TimeLapse = "";
public static String HsmCardName = "";
public static String HsmFilter = "";
public static String HsmModules = "";   
public static String UrlServerCertificates = "";
@Override 
public void run() {
java.io.PrintWriter writer = null;
TStores stores = new TStores ();

    //TUtil util = new TUtil ();
    java.io.ObjectOutputStream objectOutputStream = null;
    try {
        this.socket.setKeepAlive (false);
        java.io.ObjectInputStream objectInputStream = new java.io.ObjectInputStream(this.socket.getInputStream ());
        Object[] data = (Object[])objectInputStream.readObject (); //Lee los datos enviados desde el cliente
        Class instance = TImplementation.class;
        Object object = instance.newInstance ();
        System.out.println("Datos enviados " + data.length);
                    System.out.println("ID al inicio de Tstores es " + stores.Transfer);
        Class[] paramsTypes = new Class[data.length + 0x01];
        Object[] params = new Object[data.length + 0x01];

        params[0x00] = stores;
        params[0x01] = writer;
        paramsTypes[0x00] = TStores.class;
        paramsTypes[0x01] = java.io.PrintWriter.class;

        String methodName = data[0x00].toString ();
        //util.SaveInfoLog ("Metodo: " + methodName);

        for (int n = 2; n < params.length; n++) {
            paramsTypes[n] = data[n - 1].getClass();
            params[n] = data[n - 1];
            System.out.println ("pos: " + n + " value: " + params[n] + " :: " + paramsTypes[n]);
        }

                    identify(stores, methodName, params[2].toString(), params[3].toString(), params[4].toString(), params[5].toString());

                    if(TProcess.ActiveLog.equals("not")){
                        writer = new java.io.PrintWriter(new java.io.FileOutputStream(TProcess.PathLog+" "));
                    }else{
                        writer = new java.io.PrintWriter(new java.io.FileOutputStream(TProcess.PathLog+"Bitacora"+stores.Transfer+".log"));
                    }  
                    params[0x01] = writer;

                    java.lang.reflect.Method method = instance.getDeclaredMethod(methodName, paramsTypes);
        Object[] response = (Object[])method.invoke(object, params);
                    if(response[0x01].equals("Satisfactorio") && TProcess.ActiveLog.equals("not")){
                        java.io.File file = new java.io.File(TProcess.PathLog+"Bitacora"+stores.Transfer+".log");
                        file.delete();
                    }
                    if(response[0x01].equals("Satisfactorio") && TProcess.ActiveLog.equals("yes")){
                        java.io.File file = new java.io.File(TProcess.PathLog+"Bitacora"+stores.Transfer+".log");
                        java.io.File Newfile = new java.io.File(TProcess.PathLog+"Bitacora"+stores.Transfer+"s"+".log");
                        file.renameTo(Newfile);   
                    }

        objectOutputStream = new java.io.ObjectOutputStream(this.socket.getOutputStream());
        objectOutputStream.writeObject(response);
                    stores.CloseConnection();
                    stores = null;
        objectOutputStream.close();

    } catch (Exception ee) {
        //util.SaveWarningLog ("General " + ee.toString () + ee.getLocalizedMessage());
        try {
            objectOutputStream = new java.io.ObjectOutputStream (this.socket.getOutputStream ());
            objectOutputStream.writeObject (new Object[]{-99, "El método solicitado no existe"});
        } catch (Exception ae) { ae.toString (); }
    }
    try {writer.close(); writer=null; } catch (Exception ee) { System.out.println(ee.toString()); }
    try {objectOutputStream.close(); } catch (Exception ee) { ee.toString (); }
    try { this.socket.close(); } catch (Exception ee) {ee.toString (); }
    this.socket = null;
}

    private void identify(TStores stores, String methodName, String entity, String user, String password, String reference){

        if(methodName.equals("EncryptData")){
         stores.PwsTransferRg(entity, user, password, "s006", reference, TProcess.NameServer);
        } if(methodName.equals("DecryptData")){
           stores.PwsTransferRg(entity, user, password, "s008", reference, TProcess.NameServer);
        } if(methodName.equals("VerifyDataPkcs1")){
           stores.PwsTransferRg(entity, user, password, "u031", reference, TProcess.NameServer);
        } if(methodName.equals("GeneratePkcs10")){
           stores.PwsTransferRg(entity, user, password, "u032", reference, TProcess.NameServer);
        } if(methodName.equals("SignDataPkcs1")){
           stores.PwsTransferRg(entity, user, password, "u032", reference, TProcess.NameServer);
        } if(methodName.equals("CheckConsistency")){
           stores.PwsTransferRg(entity, user, password, "s002", reference, TProcess.NameServer);
        } if(methodName.equals("EncryptDataExternal")){
           stores.PwsTransferRg(entity, user, password, "s007", reference, TProcess.NameServer);
        } if(methodName.equals("RequestOcsp")){
            stores.PwsTransferRg(entity, user, password, "s002", reference, TProcess.NameServer);
        } if(methodName.equals("RequestTimeStamping")){
            stores.PwsTransferRg(entity, user, password, "s003", reference, TProcess.NameServer);
        } if(methodName.equals("VerifyTimeStamping")){
            stores.PwsTransferRg(entity, user, password, "s012", reference, TProcess.NameServer);
        } if(methodName.equals("RequestOcspTorrent")){
            stores.PwsTransferRg(entity, user, password, "s002", reference, TProcess.NameServer);
        } if(methodName.equals("VerifyDataPkcs1Torrent")){
           stores.PwsTransferRg(entity, user, password, "u031", reference, TProcess.NameServer);
        } if(methodName.equals("VerifyDataPkcs1Torrent")){
           stores.PwsTransferRg(entity, user, password, "u031", reference, TProcess.NameServer);
        } if(methodName.equals("GetCertificateTorrent")){
           stores.PwsTransferRg(entity, user, password, "u031", reference, TProcess.NameServer);
        }          
    }  
    }     

这是实现了日志的方法

public Object[] EncryptData(TStores stores, PrintWriter writer, String        entity, String user, String password, String reference, String idRsa, byte[] data, Integer algorithm) {
        TUtil util = new TUtil("EncryptData: " + entity + "," + user + "," + reference + "," + idRsa + "," + data.length + "," + algorithm);           
        //Object[] result = stores.PwsTransferRg(entity, user, password, "s006", reference, TProcess.NameServer);
        System.out.println("en la prueba con encryptdata");
        Object result [];

        writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                + new Throwable().getStackTrace()[0].getLineNumber());
        writer.println(TLogFunctions.info + "Estoy entrando al método");
        writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                + new Throwable().getStackTrace()[0].getLineNumber());
        writer.println(TLogFunctions.info + "DEL USUARIO");
        writer.println("Obteniendo datos de usuario\nEntidad " + entity + "\nUsuario " + user + "\nReferencia " + reference + "\nIDRSA: " + idRsa);
        writer.println(TLogFunctions.info + "DEL USUARIO");

        int state = (Integer) stores.state;
        if (state != 0x00) {
            writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                    + new Throwable().getStackTrace()[0].getLineNumber());
            writer.println(TLogFunctions.severe + "PwsTransferRg: " +stores.des);
            writer.println("//////////////////////////////////////////////////");
            writer.close();
            return stores.PwsTransferEstadoRgExt(state, "PwsTransferRg: " + stores.des, "");
        }

        writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                + (new Throwable().getStackTrace()[0].getLineNumber() + 4));
        writer.println(TLogFunctions.warning + "Entrando al dispositivo Thales");

        byte[] dataEncrypted = null;
        TSecure secure = new TSecure();
        TThales thales = new TThales();
        if ((algorithm == 0x0b) || (algorithm == 0x0c)) {
            com.ncipher.km.nfkm.Key general = thales.GetGeneral(TProcess.KeysProperties, idRsa);
            if (general == null) {
                writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                        + new Throwable().getStackTrace()[0].getLineNumber());
                writer.println(TLogFunctions.severe + "GetGeneral: No se ha podido obtener la Llave");
                writer.println("//////////////////////////////////////////////////");
                writer.close();
                return stores.PwsTransferEstadoRgExt(-0x07, "GetGeneral: No se ha podido obtener la Llave", "");
            }

            try {
                dataEncrypted = secure.EncryptSimetric(general, data, algorithm);
            } catch (Exception ee) {
                writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                        + new Throwable().getStackTrace()[0].getLineNumber());
                writer.println(TLogFunctions.severe + "Encrypt: No se ha Encriptado la información");
                writer.println("//////////////////////////////////////////////////");
                writer.close();
                return stores.PwsTransferEstadoRgExt(-0x06, "Encrypt: No se ha Encriptado la informacion", ee.toString());
            }
        } else {
            writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                    + new Throwable().getStackTrace()[0].getLineNumber());
            writer.println(TLogFunctions.severe + "Algoritmo " + algorithm);
            java.security.PublicKey publicKey = thales.GetPublicKey(TProcess.KeysProperties, idRsa);
            if (publicKey == null) {
                writer.println(TLogFunctions.severe + "GetPublicKey: No se ha podido obtener la Llave Pública\n" + "Estado " + -0x07);
                writer.println("//////////////////////////////////////////////////");
                writer.close();
                return stores.PwsTransferEstadoRgExt(-0x07, "GetPublicKey: No se ha podido obtener la Llave Publica", "");
            }

            try {
                dataEncrypted = secure.Encrypt(publicKey, data, algorithm);
            } catch (Exception ee) {
                writer.println(TLogFunctions.severe + "Encrypt: No se ha Encriptado la información \n" + ee.toString());
                writer.println("//////////////////////////////////////////////////");
                writer.close();
                return stores.PwsTransferEstadoRgExt(-0x06, "Encrypt: No se ha Encriptado la informacion", ee.toString());
            }

        }

        writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                + (new Throwable().getStackTrace()[0].getLineNumber() + 2));
        result = stores.PpoProcCifraHsmRg(idRsa, data, dataEncrypted, algorithm, ".");
        state = (Integer) result[0x00];
        if (state != 0x00) {
            writer.println(TLogFunctions.severe + "PpoProcCifraHsmRg: " + result[0x01].toString() + result[0x02].toString());
            writer.println("//////////////////////////////////////////////////");
            writer.close();
            return stores.PwsTransferEstadoRgExt(state, "PpoProcCifraHsmRg: " + result[0x01].toString(), result[0x02].toString());
        }

        String b64DataEncrypted = util.BinToBase64(dataEncrypted);
        util.SaveInfoLog("BinToBase64: " + b64DataEncrypted);
        writer.println(TLogFunctions.date() + new Throwable().getStackTrace()[0].getMethodName() + " Line "
                + (new Throwable().getStackTrace()[0].getLineNumber() - 2));
        writer.println(TLogFunctions.warning + "Satisfactorio:\n " + b64DataEncrypted);
        writer.println("//////////////////////////////////////////////////"); 
        writer.close();
        stores.CloseConnection();
        return stores.PwsTransferEstadoRgExt(0x00, "Satisfactorio", b64DataEncrypted);
}

Print writer是通过参数发送的,并且在类TProcess中关闭时,我确定该文件已关闭,因为我要保存的所有内容都在日志文件中

当服务器中的内存增加时,我看不到内存,因为服务器位于另一个地方,他们只告诉我内存问题,但是我在我的腿上进行了内存测试,但确实没有释放内存,

这是我的第一份工作,我真的想尽我最大的努力,但是我试图一个月解决这个问题,而我只工作了两个月(我正在试用两个月),所以我肯定不会将保留这项工作,但至少我想解决这个问题。 我接受您可以提供的所有帮助,我已经尝试了许多解决方案,并且存储器的状态始终相同,请原谅我的英语不好。

0 个答案:

没有答案