据说Java有很好的内存回收功能,不知为何,还是出现了严重的内存泄漏问题,请高手帮助解决。
如下是我的画图程序:
public void paint(Graphics g){
Image bimg = createImage(800,600);
Graphics gimg = bimg.getGraphics();
gimg.drawImage("aa.jpg", 0, 0, 800, 600,null); // aa.jpg is 80600
g.drawLine(100,100,200,200)
imageLabel.setIcon(new ImageIcon(bimg.getScaledInstance((int)(800*xscale), (int)(600*yscale),Image.SCALE_DEFAULT))); //imageLabel is a JLabel
gimg.dispose();//release graphics resource }为了实现实时画图,我在单独的进程里面实时的repaint()class Ticker extends Thread {
public Ticker() {
start();
}
public synchronized void run() {
while (true) {
try {
sleep(200);
} catch(InterruptedException e) {
System.err.println("Interrupted");
}
if (operation==1){
repaint();
}
}
}
}随后就每2秒内存增加2M左右,运行时间稍长,电脑就几乎停止响应了。
感觉好像是由于PAINT里面不断的new对象出现导致的,但是不知道怎么处理,请高手帮忙!
程序的目的是想实现双缓存,在画面外先将图画到bimg的内存中。
如下是我的画图程序:
public void paint(Graphics g){
Image bimg = createImage(800,600);
Graphics gimg = bimg.getGraphics();
gimg.drawImage("aa.jpg", 0, 0, 800, 600,null); // aa.jpg is 80600
g.drawLine(100,100,200,200)
imageLabel.setIcon(new ImageIcon(bimg.getScaledInstance((int)(800*xscale), (int)(600*yscale),Image.SCALE_DEFAULT))); //imageLabel is a JLabel
gimg.dispose();//release graphics resource }为了实现实时画图,我在单独的进程里面实时的repaint()class Ticker extends Thread {
public Ticker() {
start();
}
public synchronized void run() {
while (true) {
try {
sleep(200);
} catch(InterruptedException e) {
System.err.println("Interrupted");
}
if (operation==1){
repaint();
}
}
}
}随后就每2秒内存增加2M左右,运行时间稍长,电脑就几乎停止响应了。
感觉好像是由于PAINT里面不断的new对象出现导致的,但是不知道怎么处理,请高手帮忙!
程序的目的是想实现双缓存,在画面外先将图画到bimg的内存中。
帮你好找了找那个类...,你可以查看sun的swing多线程编程的教程:
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html
我用了另外的方法:
gimg.clearRect(....)实时刷新画图的内存缓存,只初始化一个实例,然后调用imagelabel的updateUI.就能实时显示图象了。