PDA

View Full Version : سوال: OutOfMemoryError:java heap space - Memory leakage



pronetin
سه شنبه 21 اردیبهشت 1389, 04:05 صبح
سلام

من یه برنامه نوشتم که فضای زیادی برای اجرا می گیرد. معمولا در چنین مواقعی اندازه java heap را افزایش می دهند تا مشکل OutOfMemory پیش نیاید. ولی من تقریبا مطمئن هستم که نمایش خطای OutOfMemory باید دلیل دیگری داشته باشد.

توضیح زمان ایجاد Error:
من در کدم یک کلاس دارم که واسط Runnable را implement کرده است. و دو متغیر static دارد. هر وقت یک شی از این کلاس می سازم یا این که می خواهم متغیرهای static را مقداردهی کنم، OutOfMemoryError اتفاق می افتد.

حتی در اولین خط برنامه هم که این کار را انجام می دم، باز هم OutOfMemory اتفاق می افته. برای همینه که می گویم تقریبا مطمئن هستم که باید مشکل دیگری وجود داشته باشد و این مشکل ارتباطی با heap نباید نداشته باشه؟!

ممنون می شوم به خاطر راهنمایی تون.

اگر هم لازمه بگید تا بیشتر توضیح بدهم.

persianshadow
سه شنبه 21 اردیبهشت 1389, 08:05 صبح
خب برای حل کردن چنین مشکلی باید کدها رو دید.اگه هم امکانش براتون فراهم نیست از Profiler استفاده

کنید و کدهاتون رو چک کنید طبعآ با پروفایلر متوجه می‌شید کدوم بخش از کدها مشکل رو ایجاد می‌کنه.اگه هم

با profiler آشنایی ندارید کافیه گوگلینگ کنید.

pronetin
سه شنبه 21 اردیبهشت 1389, 10:39 صبح
خطایی که داده می شود، بصورت زیر است:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at knn.KNNResult.<init>(KNNResult.java:18)
at knn.KNN.<clinit>(KNN.java:23)
at knn.Main.main(Main.java:38)رنگ مشخص شده متناظر با رنگ های مشخص شده در زیر در کد برنامه هستند:

توضیح کد:

ابتدا متغیر static کلاس KNN مقدار دهی می شود:

public class Main implements KNNPropertiesInterface {
public static void main(String[] args) {
KNN.dataSet = new DataSet();
...
}
}
کلاس DataSet بصورت زیر است:

public double [][]realAtt;
public String [][]nomAtt;
public String []classLabel;

public DataSet() {
realAtt = new double[sampleNo][realAttNo];
nomAtt = new String[sampleNo][nomAttNo];
classLabel = new String[sampleNo];
}کلاس KNN نیز بصورت زیر است:

public static DataSet dataSet;
public static int []testSet = new int[foldSize];
public int startIdx;
public int endIdx;
private static int []knnResultIdx = new int[foldSize];
public static KNNResult knnResult = new KNNResult();
کلاس KNNResult هم بصورت زیر است:

public int [][]neighborIdx;
public double [][]distance;

public KNNResult() {
distance = new double[foldSize][sampleNo-foldSize];
neighborIdx = new int[foldSize][sampleNo-foldSize];
}

ثابت هایی هم مانند foldSize که در بالا استفاده شده است، همگی در داخل یک interface تعریف شد اند که به شرح زیر هستند:

public static final int realAttNo = 36;
public static final int nomAttNo = 3;
public static final int sampleNo = 494021;
public static final int kfold = 10;
public static final int foldSize = sampleNo/kfold;
اگر باز هم توضیح بیشتری لازم بود، بگوید تا توضیح بدهم.
با تشکر

pronetin
سه شنبه 21 اردیبهشت 1389, 11:16 صبح
من Profiling کردم. البته هنوز خیلی با Profiling آشنا نیستم ولی دیدم که نمودار زیر می تونه مفید باشه.
http://i42.tinypic.com/2hovb7k.png
این طوری که من از این نمودار فهمیدم می شود گفت که اندازه heap کافی نیست.
درست است؟
اگر بله چگونه اندازه heap را تغییر دهم؟ من فایل netbeans.conf را نگاه کردم. هیچ کجای عددی وجود نداشت که نشان دهنده max memory heap باشد:

netbeans_default_options="-J-Dorg.netbeans.modules.tomcat.autoregister.token=12 65266521718 -J-Dorg.netbeans.modules.tomcat.autoregister.catalina Home=\"/usr/local/apache-tomcat-6.0.18\" -J-Dorg.glassfish.v3.installRoot=\"/usr/local/glassfish-v3-prelude\" -J-Dcom.sun.aas.installRoot=\"/usr/local/glassfish-v2ur2\" -J-client -J-Xverify:none -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true"

برای تغییر java heap memory در netbeans گوگلینگ کردم ولی هیچ کدام از راه ها نتیجه نداد.

mazdadoost
سه شنبه 21 اردیبهشت 1389, 12:30 عصر
http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html

mijaxmijax
سه شنبه 21 اردیبهشت 1389, 19:03 عصر
سلام

اگر یک حساب سرانگشتی انجام دهید، خواهید دید تا همان جایی که شما کد خود را توضیح داده اید و آن را رنگ کرده اید، فضای مورد نیاز برنامه از حجم حافظه شما بسیار بسیار بیشتر خواهد شد. این طور که من حساب کردم، خیلی بیشتر از 5G خواهد شد.

بنابراین JVM تقصیر نداره؟!:چشمک: