Bom dia pessoal,
Estou com o seguinte problema, ontem eu estava com problema na minha aplicação onde uma imagem após ser carregada, estourava a memória da VM.
Então utilizando parametros da VM consegui resolver temporáriamente este problema.
O seguinte problema me ocorre. Quando essa imagem é carregada, executei pelo modo debug pra ver, e segue processo que ela tem:
- Cria um um fileChooser e o cara seleciona a imagem;
- Ao selecionar a image ele cria um view no fileChooser, ao criar o view no fileChooser ele aloca + 50 mb na memória da aplicação. Até ai tudo bem, pois executando a imagem num navegador ou coisa do tipo ela carrega isto na memória. São imagens grandes de quantidade de pixel, não de tamanho.
- Ao selecionar item… ele cria um File e deste File ele cria um ImageIcon…
- Deste ImageIcon ele cria um Image implementado no projeto por nós… e neste image segue o codigo que faz:
No local onde diz “AQUIIII” ele alocal mais 100mb na VM, e isso da o break na aplicação se não tiver configurado com os parametros pra VM.
Só que eu quero que a imagem abra com menos alocação de memória, e não que eu passe parametros para alocar mais memória…
E o que acontece é que cria + / - 4 objetos na aplicação enquanto gera esse código! pode ser má lógica no código! E são 4 objetos de imagem…
Se alguem puder me dar uma luz ai… agradeço!!
public void generateThumbnail()
{
//create its thumbnail
ImageIcon thumbnail = null;
ImageIcon thumbnailBig = null;
//select scale method
int scaleMethod;
BufferedImage bufferedImage = null;
Graphics2D intersectionGraphics = null;
ImageIcon tmpImage = null;
//create a new digital image for drawing
if(Math.abs(Math.sin(rotation*Math.PI/180))<=1e-5)
{
bufferedImage = new BufferedImage(
digitalImage.getIconWidth(), digitalImage.getIconHeight(),
BufferedImage.TYPE_INT_RGB);
intersectionGraphics = bufferedImage.createGraphics(); //AQUIIIII
tmpImage = new ImageIcon( bufferedImage );
AffineTransform tx = new AffineTransform();
tx.rotate(rotation*Math.PI/180, digitalImage.getIconWidth()/2,
digitalImage.getIconHeight()/2);
intersectionGraphics.drawImage( digitalImage.getImage(), tx, null );
}
else
{
bufferedImage = new BufferedImage(
digitalImage.getIconHeight(), digitalImage.getIconWidth(),
BufferedImage.TYPE_INT_RGB);
intersectionGraphics = bufferedImage.createGraphics();
tmpImage = new ImageIcon( bufferedImage );
AffineTransform tx = new AffineTransform();
tx.rotate(rotation*Math.PI/180, 0, 0);
if(Math.sin(rotation*Math.PI/180) > 0)
{
tx.translate(0,-digitalImage.getIconHeight());
}
else
{
tx.translate(-digitalImage.getIconWidth(),0);
}
intersectionGraphics.drawImage( digitalImage.getImage(), tx, null );
}
/* Graphics2D intersectionGraphics = bufferedImage.createGraphics();
ImageIcon tmpImage = new ImageIcon( bufferedImage );
AffineTransform tx = new AffineTransform();
tx.rotate(rotation*Math.PI/180, digitalImage.getIconWidth()/2,
digitalImage.getIconHeight()/2);
intersectionGraphics.drawImage( digitalImage.getImage(), tx, null );*/
//draw digital image
/*intersectionGraphics.drawImage( digitalImage.getImage(), 0, 0,
digitalImage.getIconWidth(),
digitalImage.getIconHeight(), null );*/
//draw all elements
for(Iterator<AbstractGraphic> it = graphics.iterator(); it.hasNext();){
//paint graphic on this graphical context
it.next().paint(intersectionGraphics, 1);
}
//check extension
if( fileName.indexOf(".gif") > 0 )
{
//scale gif with default method
//it also works with animated gifs
scaleMethod = java.awt.Image.SCALE_DEFAULT;
}
else
{
//scale everything else with smooth scale
scaleMethod = java.awt.Image.SCALE_SMOOTH;
}
//check image aspect
if( ((float)tmpImage.getIconHeight()) /
((float)tmpImage.getIconWidth() )
<= 0.75 )
{
//image is wide
//check width
if( tmpImage.getIconWidth() > Image.THUMBNAILWIDTH )
{
//rescale image
thumbnail = new ImageIcon(
tmpImage.getImage().getScaledInstance(
Image.THUMBNAILWIDTH, -1, scaleMethod ));
thumbnailBig = new ImageIcon(
tmpImage.getImage().getScaledInstance(
Image.THUMBNAILWIDTHBIG, -1, scaleMethod ));
}
else
{
//no need to rescale image
thumbnail = new ImageIcon( tmpImage.getImage() );
thumbnailBig = new ImageIcon( tmpImage.getImage() );
}
}
else
{
//image is tall
//check height
if( digitalImage.getIconHeight() > Image.THUMBNAILHEIGHT )
{
//rescale image
thumbnail = new ImageIcon(
tmpImage.getImage().getScaledInstance(
-1, Image.THUMBNAILHEIGHT, scaleMethod) );
thumbnailBig = new ImageIcon(
tmpImage.getImage().getScaledInstance(
-1, Image.THUMBNAILHEIGHTBIG, scaleMethod) );
}
else
{
//no need to rescale image
thumbnail = new ImageIcon( digitalImage.getImage() );
thumbnailBig = new ImageIcon( digitalImage.getImage() );
}
}
//set thumbnail
setThumbnail( thumbnail );
setThumbnailBig( thumbnailBig );
}