मेरा जावा लिखित एप्लिकेशन बहुत अधिक मेमोरी का उपभोग करता है।जावा बहुत अधिक मेमोरी का उपभोग करता है
प्रोग्राम कैसे काम करता है: उपयोगकर्ता कैलेंडर (जीयूआई) से एक तिथि चुनता है और एप्लिकेशन डेटा को जेटीबल घटक में लोड करता है। हर बार डेटा लोड किया जाता है, नया टेबल मॉडल बनाया और सेट किया जाता है। कोई नया जेटीबल नहीं बनाया गया है, सिर्फ मॉडल।
समस्या क्या है?: कैलेंडर से प्रत्येक नए दिन का चयन और जेटीबल में लोडिंग मेमोरी की 2-3 एमबी का उपभोग करता है। प्रारंभिक ऐप पर सीसीए 50-60 एमबी रैम का उपभोग करता है, कैलेंडर पर कुछ "क्लिक" (20 की तरह) के बाद, आवेदन पूर्ण हीप आकार (128 एमबी) का उपभोग करता है। आवेदन दुर्घटनाओं, निश्चित रूप से ...
मुझे क्या करना चाहिए?: मुझे यकीन है कि डेटाबेस क्वेरी ठीक है। मैं किसी भी तरह से बड़े ढेर आकार को सेट कर सकता हूं (मैं googled, लेकिन यह मेरे कंप्यूटर के लिए केवल समाधान होगा, उपयोगकर्ता यह नहीं करेंगे) या मुझे किसी भी तरह डीबी डेटा के साथ पुराने tableModel हटा देना चाहिए। लेकिन क्या यह कचरा कलेक्टर का काम नहीं होना चाहिए? मैं इसे मजबूर करने में सक्षम हूं (System.gc()) लेकिन इससे मदद नहीं मिलती है ...
किसी भी सलाह के लिए धन्यवाद!
संपादित करें: कोड कैलेंडर की घटनाओं से निपटने के लिए (मैं हटाए गए जावाडोक, यह मेरी मातृभाषा में है)
package timesheet.handlers;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.jdesktop.swingx.JXMonthView;
import org.jdesktop.swingx.event.DateSelectionEvent;
import org.jdesktop.swingx.event.DateSelectionListener;
import timesheet.database.WorkerOperations;
import timesheet.frames.WorkerFrame;
import timesheet.logictrier.*;
public class WorkerMonthViewHandler {
private JXMonthView monthView;
private WorkerFrame workerFrame;
private WorkerOperations wops;
private Date[] week = new Date[5];
private WorkerTasksTableHandler wtth;
public WorkerMonthViewHandler(WorkerFrame workerFrame) {
this.workerFrame = workerFrame;
this.monthView = workerFrame.getWorkerMonthView();
wops = workerFrame.getWorkerOperations(); // for DB usage
}
public void initMonthView() {
List<Task> tasks = wops.getWorkerTasks(workerFrame.getWorker()); // db select
for (Task task : tasks) {
if (!monthView.getSelection().contains(task.getPlannedStart())) {
monthView.addFlaggedDates(task.getPlannedStart());
monthView.addFlaggedDates(task.gePlannedEnd()); // not really important
}
}
monthView.setSelectionDate(new Date());
monthView.getSelectionModel().addDateSelectionListener(new DateSelectionListener() {
public void valueChanged(DateSelectionEvent dse) {
Date d = monthView.getSelectionDate();
for (int i=0; i<week.length; i++) {
if (d.equals(week[i])) {
return;
}
}
Calendar cal = new GregorianCalendar();
cal.setTime(d);
long dayMs = 24 * 60 * 60 * 1000;
switch (cal.get(Calendar.DAY_OF_WEEK)) {
case(Calendar.MONDAY) : {
week[0] = new Date(cal.getTimeInMillis());
week[1] = new Date(cal.getTimeInMillis()+dayMs);
week[2] = new Date(cal.getTimeInMillis()+2*dayMs);
week[3] = new Date(cal.getTimeInMillis()+3*dayMs);
week[4] = new Date(cal.getTimeInMillis()+4*dayMs);
} break;
case (Calendar.TUESDAY) : {
week[0] = new Date(cal.getTimeInMillis()-dayMs);
week[1] = new Date(cal.getTimeInMillis());
week[2] = new Date(cal.getTimeInMillis()+1*dayMs);
week[3] = new Date(cal.getTimeInMillis()+2*dayMs);
week[4] = new Date(cal.getTimeInMillis()+3*dayMs);
} break;
case (Calendar.WEDNESDAY) : {
week[0] = new Date(cal.getTimeInMillis()-2*dayMs);
week[1] = new Date(cal.getTimeInMillis()-dayMs);
week[2] = new Date(cal.getTimeInMillis());
week[3] = new Date(cal.getTimeInMillis()+1*dayMs);
week[4] = new Date(cal.getTimeInMillis()+2*dayMs);
} break;
case (Calendar.THURSDAY) : {
week[0] = new Date(cal.getTimeInMillis()-3*dayMs);
week[1] = new Date(cal.getTimeInMillis()-2*dayMs);
week[2] = new Date(cal.getTimeInMillis()-1*dayMs);
week[3] = new Date(cal.getTimeInMillis());
week[4] = new Date(cal.getTimeInMillis()+1*dayMs);
} break;
case (Calendar.FRIDAY) : {
week[0] = new Date(cal.getTimeInMillis()-4*dayMs);
week[1] = new Date(cal.getTimeInMillis()-3*dayMs);
week[2] = new Date(cal.getTimeInMillis()-2*dayMs);
week[3] = new Date(cal.getTimeInMillis()-dayMs);
week[4] = new Date(cal.getTimeInMillis());
} break;
case (Calendar.SATURDAY) : {
week[0] = new Date(cal.getTimeInMillis()-5*dayMs);
week[1] = new Date(cal.getTimeInMillis()-4*dayMs);
week[2] = new Date(cal.getTimeInMillis()-3*dayMs);
week[3] = new Date(cal.getTimeInMillis()-2*dayMs);
week[4] = new Date(cal.getTimeInMillis()-dayMs);
} break;
case (Calendar.SUNDAY) : {
week[0] = new Date(cal.getTimeInMillis()-6*dayMs);
week[1] = new Date(cal.getTimeInMillis()-5*dayMs);
week[2] = new Date(cal.getTimeInMillis()-4*dayMs);
week[3] = new Date(cal.getTimeInMillis()-3*dayMs);
week[4] = new Date(cal.getTimeInMillis()-2*dayMs);
} break;
}
wtth = new WorkerTasksTableHandler(workerFrame,week);
wtth.createTable(); // sets model on JTable
}
});
}
public void reportTask() {
wtth.reportTasks(); // simple DB insert
}
}
का उपयोग NetBeans प्रोफाइलर: लेने की तिथि: सूर्य 28 14:25:16 सीईटी फ़रवरी 2010 फ़ाइल: सी: ... \ निजी \ प्रोफाइलर \ java_pid4708.hprof फ़ाइल का आकार: 72,2 एमबी
Total bytes: 62 323 264
Total classes: 3 304
Total instances: 1 344 586
Classloaders: 18
GC roots: 2 860
Number of objects pending for finalization: 0
हम कोड देख सकते हैं? – Fernando
आप एक डीबी का जिक्र करते हैं ... क्या आप यह कर सकते हैं कि क्या कर रहा है, आप क्या डीबी का उपयोग कर रहे हैं, अगर आप अपने परिणामसेट्स बंद कर रहे हैं, आदि ... एक बहुत अधिक संभावित अपराधी लगता है। साथ ही, क्या आप पुराने मॉडल के लिए कोई संदर्भ रखते हैं? मॉडल में आप कितना डेटा लोड करते हैं? क्या आपकी तालिका में कस्टम रेंडरर हैं? – PSpeed
नोट: अतीत में मैंने जेटीबल टेबल मॉडल को बदल दिया है जिसमें कई हजार पंक्तियां हैं ... और डिफ़ॉल्ट रूप से हीप आकार में कभी वृद्धि नहीं हुई है। तो यहां कुछ और खेलना है। – PSpeed