我正在使用java
制作一个简单的图片浏览器javafx
打开大约10张照片后,它需要大量的内存!
显然我需要正确关闭已打开的照片(现在没有显示!)(在我的测试/用例中,照片很大!!)
这只是代码的一部分......
但这一切都需要知道
private HashMap<Image, String> adrs; // a hashMap from thumbNail to address of the image
ObservableList<ImageView> list; // list of thumbNails
@FXML public ListView<ImageView> pics;
@FXML public ImageView preview;
public void init(String[] picAdrs){
loadThumbNails(picAdrs); // initializes thumbNails (list)
pics.setItems(list);
pics.getSelectionModel().selectedItemProperty().addListener((v, oldvalue, newvalue) -> {
// --> this is where the previous value of "preview.getImage()" should be closed <--
// (and i don't know how!)
preview.setImage( new Image(adrs.get(newvalue.getImage()));
// and more (not related codes...)
}
}
private void loadThumbNails(String[] picAdrs){
// initializing list & adrs
for(String i : picAdrs){
Image img = new Image(new File(i).toURI().toString(), 200, 0, true, false);
ImageView iv = new ImageView();
iv.setImage(img);
adrs.put(img, new File(i).toURI().toString());
list.add(iv);
}
}
拇指指甲位于左侧,“预览”位于右侧:
Just a preview of the Scene
我使用垃圾收集器减少了大约50%的ram使用率但我仍然想要更好的方法,因为我知道system.gc
不可靠
答案 0 :(得分:0)
您需要删除对图像的所有引用。在ImageView中有对Image的引用,因此您还需要删除对ImageView的任何引用,或者将ImageView中的image字段设置为null。
我在代码中看到三个集合,其中对Image或ImageView的引用可能会延迟。
private HashMap<Image, String> adrs; // a hashMap from thumbNail to address of the image
ObservableList<ImageView> list; // list of thumbNails
@FXML public ListView<ImageView> pics;
您必须找到一种方法从这些集合中删除这些对象。只要他们在那里,他们就会占用公羊。
我会考虑做的不是存储图像和放大器。 ImageView对象本身可能会将URL存储到它们中。 URL可以指向文件或http位置。然后实时加载它。如果你想提前装载所有东西,那么使用ram就是成本。
此外,在您旅行期间,请查看WeakHashMap。这是一个地图,将删除旧的引用,这将释放你的内存。因此,您只需要专注于将Images / ImageViews添加到您的集合中,并让Java的WeakHashMap删除它们。
答案 1 :(得分:0)
finilize()
可能有用......(但不知道如何使用它!)
来自Go-like Channels的答案我设法将ram使用量减少到不足100mb。但由于它使用gc,它不可靠(System.gc
命令可能无法运行gc)