首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能否在诺基亚手机(N80/N95)上使用Java Midlet录制音频,而不会出现JVM内存泄漏?

您能否在诺基亚手机(N80/N95)上使用Java Midlet录制音频,而不会出现JVM内存泄漏?
EN

Stack Overflow用户
提问于 2008-09-19 09:54:44
回答 2查看 1.4K关注 0票数 2

我想反复使用Java Midlet在诺基亚手机上捕获音频片段。我目前的经验是,使用Sun文档中的代码(参见:http://java.sun.com/javame/reference/apis/jsr135/javax/microedition/media/control/RecordControl.html)并将其包装在"while(true)“循环中是有效的,但应用程序会慢慢消耗手机上的所有内存,程序最终会抛出一个异常,并无法启动进一步的录制。

消耗的内存不是Java堆内存-我的示例程序(下面)显示Java内存大致保持在185,000字节左右-但在诺基亚提供的底层支持库中存在某种内存泄漏;我认为内存泄漏发生的原因是,如果您在运行Java应用程序一段时间后尝试启动另一个(非Java)应用程序(例如web浏览器),手机会终止该应用程序,并发出内存不足的警告。

我尝试了几种与文档中Sun的规范示例所采用的方法不同的方法(每次循环初始化所有内容,只初始化一次,调用尽可能多的非严格必要的解除分配样式的函数,等等)。似乎没有一个是成功的。下面是一个简单的示例程序,我相信它应该可以工作,但在N80 (尽管有固件更新)和N95上运行了大约15分钟后崩溃。其他论坛也报告了此问题,但那里提供的解决方案似乎不起作用(例如,请参阅:http://discussion.forum.nokia.com/forum/showthread.php?t=129876)。

代码语言:javascript
复制
import javax.microedition.media.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;

public class Standalone extends MIDlet {

protected void startApp() {

 final Form form = new Form("Test audio recording");
 final StringItem status = new StringItem("Status","");
 form.append(status);
 final Command exit = new Command("Exit", Command.EXIT, 1);
 form.addCommand(exit);
 form.setCommandListener(new CommandListener() {
    public void commandAction(Command cmd, Displayable disp) {
        if (cmd == exit) {
        destroyApp(false);
        notifyDestroyed();
        }
    }
    });

 Thread t = new Thread(){
    public void run() {
        int counter = 0;
        while(true) {
        //Code cut 'n' paste from Sun JSR135 javadocs for RecordControl:
        try {
            Player p = Manager.createPlayer("capture://audio");
            p.realize();
            RecordControl rc = (RecordControl)p.getControl("RecordControl");
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            rc.setRecordStream(output);
            rc.startRecord();
            p.start();
            Thread.currentThread().sleep(5000);
            rc.commit();
            p.close();
        } catch (Exception e) {
            status.setText("completed "+counter+
                   " T="+Runtime.getRuntime().totalMemory()+
                   " F="+Runtime.getRuntime().freeMemory()+
                   ": Error: "+e);
            break;
        }
        counter++;
        status.setText("completed "+counter+
                   " T="+Runtime.getRuntime().totalMemory()+
                   " F="+Runtime.getRuntime().freeMemory());
        System.gc(); //One forum post suggests this, but doesn't help
        this.yield();
        }
    }
    };
 t.start(); 
 final Display display = Display.getDisplay(this);
 display.setCurrent(form);
}

protected void pauseApp() {}
protected void destroyApp(boolean bool) {}
}    
EN

回答 2

Stack Overflow用户

发布于 2008-09-20 21:28:54

N系列诺基亚设备存在已知内存泄漏。它并不是特定于Java的,而是在操作系统的某个地方。

最近在开发一款针对诺基亚N90的游戏时,我也遇到了类似的问题。我会遇到内存问题,这些问题会在应用程序的几次不同重启过程中积累起来。解决方案就是减少游戏中的整体质量和资源量……

我建议您尝试更新固件,因为较新的版本应该可以解决此问题。然而,诺基亚并没有使升级固件变得非常容易,在大多数情况下,您必须将设备发送到诺基亚。而且,如果这个应用程序不是仅供您个人使用,那么您必须预料到使用N系列设备的任何人都不会安装最新的固件。

最后,我建议花点时间看看诺基亚论坛,因为我知道有一些关于内存泄漏和N系列设备的帖子。这里有一篇文章似乎解决了你所遇到的问题。

http://discussion.forum.nokia.com/forum/showthread.php?t=123486

票数 1
EN

Stack Overflow用户

发布于 2008-09-19 10:05:49

我认为你应该提交一个bugreport,而不是试图解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/100832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档