сегодня я немного исказился с открытием/масштабированием/отображением изображения на Java и написал немного кода, чтобы открыть файл изображения, масштабировать его случайным образом и отображать его на короткое время.Утечка памяти (?) При отображении изображений в java
Проблема: после отображения ее как 100-1000 раз, используемая память моего «javaw.exe» растет и растет, она даже достигла 1 ГБ памяти.
Я не знаю, где утечка памяти в моем коде, так как единственная память, в которой есть вещи, - это мои picures, и есть только 2 (исходное изображение и тот, который получает масштабирование, которое всегда присваивается одной и той же переменной (temp), поэтому «старшие» должны быть сняты GC), может быть, вы, ребята, могли бы просмотреть его, довольно просто.
1) Вы выбираете изображение с жесткого диска
2) Он получает масштабируется случайно
3) Его отображается в течение короткого периода времени, а затем исчезает
4) перейти к этапу 2)
масштабировать изображение, я использовал эту библиотеку: http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.imgscalr.Scalr;
public static void main(String[] args) throws IOException, InterruptedException {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
BufferedImage originalImage = ImageIO.read(chooser.getSelectedFile());
BufferedImage temp;
while(true){
int width = (int) ((Math.random()*1000)+1);
int height = (int) ((Math.random()*1000)+1);
Thread.sleep(1000);
temp = Scalr.resize(originalImage,Scalr.Mode.FIT_EXACT, width, height);
showImage(temp, 800);
}
}
static void showImage(BufferedImage v,long length) throws InterruptedException {
JFrame frame = new JFrame();
frame.add(new JLabel(new ImageIcon(v)));
frame.setSize(v.getWidth(), v.getHeight());
frame.setVisible(true);
Thread.sleep(length);
frame.setVisible(false);
}
Это мой первый пост, поэтому, пожалуйста, задавайте вопросы, если я неясен
заранее!
EDIT: Я, мониторинг которых javaw.exe памяти нуждаясь
1 фотография отображается: 75M 100 фотографий отображаются: 330M 1000 фотографий отображаются: 2,4G
EDIT 2:
I теперь применили ваш полезный совет, но у меня все еще есть растущее количество памяти, и мой графический объект больше отображается. JFrames пустые.
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import org.imgscalr.Scalr;
public class App {
public static void main(String[] args) throws IOException, InterruptedException {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
BufferedImage originalImage = ImageIO.read(chooser.getSelectedFile());
BufferedImage temp;
JFrame frame = new JFrame();
while(true){
int width = (int) ((Math.random()*1000)+1);
int height = (int) ((Math.random()*1000)+1);
Thread.sleep(1000);
temp = Scalr.resize(originalImage,Scalr.Mode.FIT_EXACT, width, height);
showImage(temp, 500, frame);
}
}
static void showImage(BufferedImage v,long length, JFrame frame) throws InterruptedException {
SwingUtilities.invokeLater(
() -> {
frame.removeAll();
frame.revalidate();
frame.repaint();
frame.add(new JLabel(new ImageIcon(v)));
frame.setSize(v.getWidth(), v.getHeight());
frame.setVisible(true);
try {
Thread.sleep(length);
} catch (Exception e) {}
frame.setVisible(false);
frame.dispose();
});
}
}
Возможно, я поместил ваш совет в неправильные места в своем коде.
Сколько памяти вы даете Java? В конце концов, у него не хватает памяти или сбор мусора в конечном итоге? –
Вы создаете новые кадры в цикле, но никогда не закрываете их (вы просто делаете их невидимыми), и каждый из них имеет измененное изображение. Вы должны получать утечки памяти. Сбор мусора никогда не может произойти, пока эти рамки вокруг. Кроме того, вы находитесь в главной теме. Это никогда не сработает, у вас в конечном итоге закончится нехватка памяти и сбой виртуальной машины. – mttdbrd
Возможно, вам придется изменить конфигурационный файл vm и предоставить ему больше памяти. – ha9u63ar