我已經創建了此方法來以幻燈片形式顯示圖像列表。 它工作正常,直到它有超過50或60個圖像處理。然後它崩潰,與我的方法正在耗盡堆空間。我需要設置爲空嗎?
java.lang.OutOfMemoryError: Java heap space
所以我不知道我是否應該設置一些每輪循環爲空?我在這裏和網上搜索,但沒有找到答案。
這裏的方法:是
private void createSlideshow(Stage stage, ArrayList<BufferedImage> slideList, int durationInSecs) throws InterruptedException {
stage.show();
SequentialTransition slideshow = new SequentialTransition();
int i = 0;
for (BufferedImage bi: slideList) {
System.out.println(" Iteration " + (i++));
ImageView slide = new ImageView(SwingFXUtils.toFXImage(bi, null)); // LINE 108
FadeTransition fadeIn = new FadeTransition(Duration.millis(durationInSecs * 1000), slide);
fadeIn.setFromValue(0.0);
fadeIn.setToValue(1.0);
PauseTransition stayOn = new PauseTransition(Duration.millis(durationInSecs * 1000));
FadeTransition fadeOut = new FadeTransition(Duration.millis(durationInSecs * 1000), slide);
fadeOut.setFromValue(1.0);
fadeOut.setToValue(0.0);
SequentialTransition fadeInOut = new SequentialTransition();
fadeInOut.getChildren().addAll(fadeIn, stayOn, fadeOut);
slide.setOpacity(0.0);
root.getChildren().add(slide);
slideshow.getChildren().add(fadeInOut);
}
slideshow.play();
}
完整的運行時消息如下:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.nio.HeapByteBuffer.<init>(Unknown Source)
at java.nio.ByteBuffer.allocate(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.createPlatformImage(Unknown Source)
at javafx.scene.image.Image.<init>(Unknown Source)
at javafx.scene.image.WritableImage.<init>(Unknown Source)
at javafx.embed.swing.SwingFXUtils.toFXImage(Unknown Source)
at Slideshow.createSlideshow(Slideshow.java:108)
at Slideshow.start(Slideshow.java:52)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(Unknown Source)
at com.sun.javafx.application.LauncherImpl$$Lambda$64/1581649247.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$49/1915503092.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$51/1557268138.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$50/1567581361.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$39/1645995473.run(Unknown Source)
... 1 more
Exception running application Slideshow
也許你沒有足夠的圖像,你正在加載。注意:當你這樣做時,圖像將被解壓縮,因此將使用完整的未壓縮大小。例如一個2百萬像素的圖像可能會使用8 MB和32位顏色,如果您有60個圖像,則會使用1/2 GB。 –
@PeterLawrey更接近1GB:在這個實現中每個圖像有兩個內存中表示,一個是'BufferedImage'和一個是JavaFX'圖像'。 –