java - Memory Consumption is always increasing in Humble-Video -
i have been using humble-video in live streaming project convert flv mp4. i've realized java process's(in humble-video codes running) memory usage increasing when looking top command.
after changed demo source code of humble-video , put segmentfile function in infinite loop , memory usage of process again increasing when looking top command. on 2.5gib , has been running 30 mins.
i expect process's memory consumption stay stable somewhere between 40-50mb not keep increasing always.
do have idea that?
i've resolved problem.
the problem garbage collector not clear weakreferences jnimemorymanager not delete native objects. calling system.gc() after every iteration helping not exact solution.
the solution calling delete() @ end of each iteration. objects created may not expect during execution please @ objects created jnimemorymanager.getmgr().dumpmemorylog();
, @ how many objects alive jnimemorymanager.getmgr().getnumpinnedobjects();
the last state of segmentfile function below , memory consumption still stays 80 mib @ end of 15min.
private void segmentfile(string input, string output, int hls_start, int hls_time, int hls_list_size, int hls_wrap, string hls_base_url, string vfilter, string afilter) throws interruptedexception, ioexception { jnimemorymanager.getmgr().setmemorydebugging(true); demuxer demuxer = demuxer.make(); demuxer.open(input, null, false, true, null, null); // we're forcing http live streaming demo. muxer muxer = muxer.make(output, null, "hls"); muxer.setproperty("start_number", hls_start); muxer.setproperty("hls_time", hls_time); muxer.setproperty("hls_list_size", hls_list_size); muxer.setproperty("hls_wrap", hls_wrap); if (hls_base_url != null && hls_base_url.length() > 0) muxer.setproperty("hls_base_url", hls_base_url); muxerformat format = muxerformat.guessformat("mp4", null, null); /** * create bit stream filters if asked to. */ bitstreamfilter vf = vfilter != null ? bitstreamfilter.make(vfilter) : null; bitstreamfilter af = afilter != null ? bitstreamfilter.make(afilter) : null; int n = demuxer.getnumstreams(); demuxerstream[] demuxerstreams = new demuxerstream[n]; decoder[] decoders = new decoder[n]; list<muxerstream> muxerstreamlist = new arraylist(); for(int = 0; < n; i++) { demuxerstreams[i] = demuxer.getstream(i); decoders[i] = demuxerstreams[i].getdecoder(); decoder d = decoders[i]; if (d != null) { // neat; can decode. let's see if decoder can fit mp4 format. if (!format.getsupportedcodecs().contains(d.getcodecid())) { throw new runtimeexception("input filename (" + input + ") contains @ least 1 stream codec not supported in output format: " + d.tostring()); } if (format.getflag(muxerformat.flag.global_header)) d.setflag(coder.flag.flag_global_header, true); d.open(null, null); muxerstreamlist.add(muxer.addnewstream(d)); } } muxer.open(null, null); n = muxer.getnumstreams(); muxerstream[] muxerstreams = new muxerstream[n]; coder[] coder = new coder[n]; (int = 0; < n; i++) { muxerstreams[i] = muxer.getstream(i); if (muxerstreams[i] != null) { coder[i] = muxerstreams[i].getcoder(); } } mediapacket packet = mediapacket.make(); while(demuxer.read(packet) >= 0) { /** * have packet, can write packets had decoders knew with. */ final decoder d = decoders[packet.getstreamindex()]; if (packet.iscomplete() && d != null) { // check see if using bit stream filters, , if so, filter audio // or video. if (vf != null && d.getcodectype() == type.media_video) vf.filter(packet, null); else if (af != null && d.getcodectype() == type.media_audio) af.filter(packet, null); muxer.write(packet, false); } } // practice close demuxers when you're done free // file handles. humble detect if nothing else // references demuxer , close then, in habit // of cleaning after yourself, , future girlfriend/boyfriend // appreciate it. muxer.close(); demuxer.close(); muxer.delete(); demuxer.delete(); packet.delete(); format.delete(); vf.delete(); muxer = null; demuxer = null; packet = null; format = null; vf = null; (int i=0; < muxerstreams.length; i++) { if (muxerstreams[i] != null) { muxerstreams[i].delete(); muxerstreams[i] = null; } if (coder[i] != null) { coder[i].delete(); coder[i] = null; } } (int i=0; < demuxerstreams.length; i++) { if (demuxerstreams[i] != null) { demuxerstreams[i].delete(); demuxerstreams[i] = null; } if (decoders[i] != null) { decoders[i].delete(); decoders[i] = null; } } (iterator iterator = muxerstreamlist.iterator(); iterator.hasnext();) { muxerstream muxerstream = (muxerstream) iterator.next(); if (muxerstream != null) { muxerstream.delete(); muxerstream = null; } } muxerstreamlist.clear(); muxerstreamlist = null; system.out.println("number of alive objects:" + jnimemorymanager.getmgr().getnumpinnedobjects()); }
Comments
Post a Comment