我有一个Android服务,该服务使用此线程每秒更新一次通知(评论并不真正相关):
thread = new Thread() { @OverrIDe public voID run() { // Preparando la notificación de Swap NotificationCompat.Builder notificationSwap = new NotificationCompat.Builder(context) .setSmallicon(androID.R.drawable.ic_dialog_info) .setContentTitle("Notificator:"); notificationmanager notificationmanager = (notificationmanager) getSystemService(Context.NOTIFICATION_SERVICE); int notificationSwAPId = 1; // Todo: Asignar un ID que no sea "Magic number" while (!stop) { String swAPInfo = null; try{ // Todo: free devuelve sIEmpre 4 líneas? Process free = Runtime.getRuntime().exec("free"); BufferedReader freeOut = new BufferedReader( new inputStreamReader(new DatainputStream(free.getinputStream()))); free.waitFor(); freeOut.readline(); freeOut.readline(); freeOut.readline(); swAPInfo = freeOut.readline(); }catch(Exception e){ Log.e("ERROR", e.toString()); // Todo: Mejorar esto } Scanner scanner = new Scanner(swAPInfo); // Todo: Mejorar esto String swAPInfo2 = null; if (scanner.hasNext()) { scanner.skip("Swap:"); } if (scanner.hasNextInt()) { /*swAPInfo2 = "Total: " + */scanner.nextInt(); } if (scanner.hasNextInt()) { swAPInfo2 = "Usado: " + scanner.nextInt(); } if (scanner.hasNextInt()) { swAPInfo2 += "\nlibre: " + scanner.nextInt(); } // Notificando notificationSwap.setContentText(swAPInfo2); notificationmanager.notify(notificationSwAPId, notificationSwap.build()); // Intentando liberar memoria //System.gc(); try { Thread.sleep(new Integer(PreferenceManager.getDefaultSharedPreferences(context).getString("frecuency", "60000"))); // Todo: Mejorar esto } catch (InterruptedException e){ Log.d("Notificator (Service)", "DetenIEndo el hilo durante la espera"); // Todo: Mejorar esto // Todo: ¿Qué pasa si el hilo es interrumpIDo fuera del try/catch? Si pilla la interrupción no hace falta la variable stop } } }};
问题是它使用大约20MB的内存,但是如果我取消注释“ //System.gc();”,该数字降低到大约3 / 4MB,那是很多垃圾.但是对我来说,每个循环运行整个垃圾收集器似乎效率不高,并且cpu使用率更高.
这就是为什么我不喜欢仅使用自动变量的c循环上的垃圾收集器,我不会遇到这个问题,但是我认为这样做可能会更好,因为我实际上并不习惯Java和AndroID.
因此,我的主要问题是,如何以一种更有效的方式降低内存使用率?我还将介绍在AndroID上更新通知的更好的方法,但我真正需要的是防止这种代码使用过多的内存.
更新:
答案表明我应该关闭流,扫描仪等,但我不确定这是否必要(关闭流和扫描仪无法解决问题),但我认为这不是问题,因为它们是被成功删除.
问题是它们在被删除之前就堆积了,我想在线程休眠之前而不是等待垃圾收集器之前将它们删除,而且据我所知,在Java中无法做到这一点,因此我需要一个更多的“垃圾收集器”友好”的方式.
解决方法:
最后,您可以执行以下 *** 作
finally {try { freeOut.close();} catch (IOException e) { e.printstacktrace();}
总结 以上是内存溢出为你收集整理的Android和Java:减少服务循环中的内存使用量全部内容,希望文章能够帮你解决Android和Java:减少服务循环中的内存使用量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)