为什么javaw.exe占用的内存持续增加,一直不释放
用SWING做的软件,功能就是从网上下载一些图片,用jtable一个row显示已经下载的图片的缩略图和图片名字。发现每显示一个图片,资源管理器里JAVAW.EXE的使用内存就增加,不到1K的图片内存会增加300K左右。用jconsole做监测,堆内存释放很正常,GC回收也及时,显示几K张图片也不会内存泄漏,而且内存增加到60M左右的时候会增加的慢一些,但是还是会持续增加,最高到100M。
eclipse中的设置-Xmx32m -Xms32m -Xmn24m -Xss128k -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeratio=10
到底是什么地方消耗内存,而且还不释放?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
修改渲染器的代码
虽然javaw.exe内存还是会一直增加,但old gen 算是很稳定了,增长的很慢,不像之前用JLable很快就内存泄漏,另外程序暂停时,如果滚动条往上移动查看图片时,还是会执行setValue(Object value)这个方法?难道重新渲染
g
这个是Swing做的,下面是个 table.你的这个是 treetable,swing里面的 cell样式,都是通过渲染器的方式来渲染的,不要往里面添加组建,添加组建也要使用 继承:DefaultTableCellRenderer 在这个实现
getTableCellRendererComponent里面添加组建:和
实现TableCellEditor来响应事件
你的Table DefaultTreeCellRenderer 图片渲染器定义的应该有问题.,因为默认的渲染器就是继承Jlable的,就不要继续new Jlabel,直接设置setIcon();就行. 给个TableCellRenderer 代码你参考下把
1.创建table:
TableColumnModel columnModel = table.getColumnModel();
StatusTableCellRenderer statusTableCellRenderer = new StatusTableCellRenderer();
BasicTableCellRenderer columnRenderer = new BasicTableCellRenderer(colsAlignment);
for (int i = 0; i < table.getColumnCount(); i++) {
columnModel.getColumn(i).setCellRenderer(columnRenderer);
}
columnModel.getColumn(0).setCellRenderer(statusTableCellRenderer);//设置地0个的渲染
tablePanel.add(tableScrollPanel, BorderLayout.CENTER);
2. BasicTableCellRenderer
3.StatusTableCellRenderer
package com.swing.table;
import java.util.Hashtable;
import javax.swing.ImageIcon;
import javax.swing.SwingConstants;
import com.swing.SwingToolkit;
import com.ui.MR;
public class StatusTableCellRenderer extends BasicTableCellRenderer {
private static final long serialVersionUID = -7165029031183872117L;
private Hashtable<String, ImageIcon> icons = new Hashtable<String, ImageIcon>();
/*
* 200030119=images/table_column_green.png
* 200030121=images/table_column_red.png
* 200030123=images/table_column_yellow.png
*/
public StatusTableCellRenderer() {
super(null);
ImageIcon greenIcon = SwingToolkit.createImageIcon(MR.TABLEHEADER_200030119_IMAGE);
ImageIcon redIcon = SwingToolkit.createImageIcon(MR.TABLEHEADER_200030121_IMAGE);
ImageIcon yellowIcon = SwingToolkit.createImageIcon(MR.TABLEHEADER_200030123_IMAGE);
icons.put("0", redIcon);
icons.put("1", greenIcon);
icons.put("2", yellowIcon);
setHorizontalAlignment(SwingConstants.CENTER);
}
public void setValue(Object value) {
if (value instanceof String) {
setIcon(icons.get(value + ""));
} else {
super.setIcon(icons.get(value + ""));
}
};
}
用MAT分析了,发现是toolkit占用old gen一直不释放,代码中使用了JLabel setIcon(imageicon)显示图片,如果在JTable中显示的过多jlabel,就会OOM,但是目前找不到解决的办法
1.估计是使用Jtable渲染 TableCellRenderer 图片出问题了,或者显示图片的方式不对.Swing 只需要一个定义一个渲染器实例,然后重复使用就行.
2.看看哪一个类占用的内存比较大.是不是 swing/AWT的类
只有old generration 在每次显示一张图片时会增加个10K内存,其他的都能正常释放
使用JVM看下 是那个地方一直在吃内存··