Возможная утечка памяти с сокетами и принтером в большом проекте - PullRequest
0 голосов
/ 24 апреля 2019

Ну, я попытаюсь объяснить эту проблему лучше, чем могу, это моя первая работа после университета, я начинаю как программист java, и моя первая задача - обновить большой проект, этот проект работаетхорошо, им нужен только журнал в каждом методе, который сохраняет все важные шаги в текстовом файле.По сути, это аппарат HSM, который предоставляет открытые ключи, с помощью которых пользователи могут шифровать и дешифровать данные, переваривать данные, проверять сертификаты и другие методы через сокет, который работает, когда приложение установлено на сервере, я добавилвход в каждый метод, но в тот момент, когда мы выпускаем приложение, приложение потребляет большую часть памяти, а приложение не освобождает память, память увеличивается с каждым разом.Для журнала, который я использовал для печати, и я не могу программировать так, как мне хотелось бы, и я не уполномочен изменять весь код, мое первое решение состояло в том, чтобы открыть локальную переменную средства записи в каждом методе, а затем добавить триггер длявсе инструкции в методе и закрывающем элементе обязательны для печати. ​​Я думаю, что это лучшее решение, но директор сказал мне, что в момент вызова вызывается средство печати, как параметр, это класс, принимающий петиции.:

Я уверен, что я закрываю все отпечатки, потому что я вижу результат в журнале, поэтому я не знаю, в чем проблема, я попытался создать отпечаток в методе и потерпел неудачу,Я пытался закрыть печать в предложениях catch, она закрывается, но память продолжает расти.С несколькими петициями приложение потребляет 5 МБ, и приложение должно получать гораздо больше петиций каждый день!Вот класс, который принимает петиции, сначала обрабатывает данные, отправленные пользователем, и создает соединение с BD, затем с помощью идентификатора, данного БД, создает журнал для этой петиции, каждый файл журнала имеет один уникальный идентификатор, если метод возвращаетхороший запрос "удовлетворительно", файл переименовывается с одним "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);
}

Пишущий модуль записи отправляется параметром и закрывается, когда в классе TProcess IЯ уверен, что файл закрыт, потому что все, что я хочу сохранить, находится в файле журнала

Я не могу видеть память при увеличении на сервере, потому что сервер находится в другом месте, они только сказали мне проблемус памятью, но я сделал тест памяти на коленях, и правда, память не освобождается,

Это моя первая работа, и я действительно хочу сделать все возможное,ork, но я пытаюсь решить эту проблему один месяц, и я работаю только два месяца (я нахожусь на испытании в течение двух месяцев), конечно, я не собираюсь сохранять эту работу, но, по крайней мере, я хочу решить эту проблему.Я принимаю всю помощь, которую вы можете оказать мне, я перепробовал много решений, и состояние памяти всегда одинаково, извините, пожалуйста, за мой плохой английский.

...