Ну, я попытаюсь объяснить эту проблему лучше, чем могу, это моя первая работа после университета, я начинаю как программист 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, но я пытаюсь решить эту проблему один месяц, и я работаю только два месяца (я нахожусь на испытании в течение двух месяцев), конечно, я не собираюсь сохранять эту работу, но, по крайней мере, я хочу решить эту проблему.Я принимаю всю помощь, которую вы можете оказать мне, я перепробовал много решений, и состояние памяти всегда одинаково, извините, пожалуйста, за мой плохой английский.