Sziasztok,
Nem nagyon ertek a Java-hoz, de lenne egy kerdesem. Van nehany Java programunk ami kulcs fontossagu szamunkra szoval nem megengedheto semmifele nemtervezett leallas. Mostanaban befelfutottunk tobb OutOfMemmory hibaba ami lenyegeben osszeomlasztotta az alkalmazast. Amit tudni kell, hogy lenyegben adat feldolgozasrol van szo, szoval folyamatosan erkeznek az uj adatok amiket a java interface feldolgoz es kiir. Ennek megfeleloen nincs olyan szituacio, hogy vegleg kifussunk a memoriabol, maximum ideglenese problema lehet.
Ugy en nem vagyok fejleszto, de feltettem azt a kerdest nekik, miert csak egy echo az OutOfMemmory exception miert nem kezeljuk valami ertelmes modon. Erre nagyabol azt a valaszt kaptam, hogy nem ertek a Java-hoz (ami igaz) szoval ne szoljak bele.
-------------------------
Frissites:
Szeretnem felhivni a figyelmet arra, hogy nem megoldat keresek a ceg probremajara itten. Hanem mint nem Java fejleszto felmerult bennem egy kerdes a Java OOM hibakezelesevel kapcsolatban es errol szeretnek velemenyeket hallani.
Szoval szerintem az OOM nem egy vegzetes hiba, csak egy pillanatnyi szituacio. Vegzetesse akkor valik, ha tovabb lepunk es hivatkozunk a le nem foglalt valtozora. Szoval szvsz a crash helyett jobb otletnek tunnik egyszeruen megakassztani a szal futasat addig amig nem tudjuk lefoglalni a valtozot.
Gondoltam valami osztaly letrehozni az alabbi logika alapjan:
double[] datalist2;
int maxwait = 120000;
int currentwait = 1;
while (true) {
try {
datalist2 = new double[datalist.length];
break;
} catch (Exception e) {
if (currentwait < maxwait ) {
currentwait *= 2;
Thread.sleep(currentwait);
continue;
} else {
// Something which we want to do if we can't get the allocate the value
// Ex: kill the threat
break;
}
}
}
Megprobaltam magam definialni egy osztalyt, de ez nem kepes primitiv tipusokat, es Double es Integer osztalyokat letrehozni:
public class allocateObject {
public static <T> T allocateObject (Class clazz) {
/* It not work with "java.lang.Integer", "java.lang.Double"
* as they doesn't have no-arg(default) constructor
*/
int postpone = 1; // the actual postpone
final int maxpostpone = 1800000; // the max milliseconds which we trying
T vissza;
while(true) {
try {
vissza = (T) clazz.newInstance();
return vissza;
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
if (postpone < maxpostpone ) {
postpone *= 2;
Thread.sleep(postpone);
continue;
} else {
return null;
}
}
}
}
}
public class teszt {
public static void main(String[] args) {
String teszt2 = allocateObject.allocateObject(String.class);
}
}