Search code examples
javaout-of-memoryxugglexuggler

java.lang.OutOfMemoryError: Java heap space using -Xmx1024m


I have an issue when i try to decode and play a video file with Xuggler. I tried with avi and mkv, from big files (2gb) to small files (20mb) and they all give me the same result : it displays a random image from the video in the window and give me an error :

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at com.xuggle.xuggler.video.BgrConverter.toImage(BgrConverter.java:182)
at com.xuggle.xuggler.Utils.videoPictureToImage(Utils.java:322)
at testxuggler.VideoWindow.showVideo(VideoWindow.java:324)
at testxuggler.MenuBarre$4.actionPerformed(MenuBarre.java:263)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1223)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1264)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

the line : BufferedImage javaImage = Utils.videoPictureToImage(newPic); triggers the error

I tried to change the memory size by adding the lines : -Xms128m -Xmx1024m to the run command line.

the code i used is the code from the tutorials available here : DecodeAndPlayVideo.java

thanks for any help!


Solution

  • OOM means, that there is no more memory available in JVM for new object's allocations. Stacktrace, that accompanies OOM exception, points to where those allocations were requested. It usually says nothing about who and why has consumed all memory.

    There are 2 most common reasons for OOM:

    1. insufficient memory for the amount of data your algorithm tries to process
    2. memory leak

    First problem can be solved either by increasing heap size with Xmx startup parameter (easy one) or by changing algorithm (hard one).

    Second problem can be solved by various ways. One I recommend is to use Plumbr, memory leak monitoring tool.