【问题标题】:Jit: Resizing JitTable from 512 to 1024 and so on.... what is this?Jit:将 JitTable 的大小从 512 调整为 1024 等等……这是什么?
【发布时间】:2012-05-04 20:34:00
【问题描述】:

已经开发了几周的安卓应用程序,我才意识到我在 catlog 中收到了这样的消息:

Jit: Resizing JitTable from 512 to 1024 
(...)
Jit: Resizing JitTable from 1024 to 2048 
(...)
Jit: Resizing JitTable from 2048 to 4096

这是什么意思?是内存泄漏还是类似的东西?

我也在 (...) 区域得到了这个:

04-24 07:59:53.131: D/dalvikvm(874): GC_EXTERNAL_ALLOC freed 207K, 48% free 2980K/5639K, external 1448K/1458K, paused 66ms
04-24 07:59:57.591: D/dalvikvm(874): GC_CONCURRENT freed 162K, 46% free 3122K/5767K, external 1371K/1673K, paused 11ms+17ms
04-24 07:59:58.771: D/dalvikvm(874): GC_CONCURRENT freed 196K, 44% free 3445K/6087K, external 1145K/1657K, paused 10ms+6ms
04-24 08:00:01.411: D/dalvikvm(874): GC_CONCURRENT freed 274K, 39% free 4267K/6983K, external 1145K/1657K, paused 6ms+7ms
04-24 08:00:04.970: D/dalvikvm(874): GC_EXTERNAL_ALLOC freed 31K, 36% free 4479K/6983K, external 1145K/1657K, paused 89ms

大约 14% 免费,我遇到了崩溃。

当我单击菜单按钮(更改活动)时会发生这种情况。 我在模拟器中测试,不知道手机中的结果...

logcat 崩溃时的错误:

04-24 08:26:34.158: E/GraphicsJNI(482): VM won't let us allocate 1536000 bytes
04-24 08:26:34.158: D/dalvikvm(482): GC_FOR_MALLOC freed 0K, 64% free 4280K/11655K, external 11662K/13614K, paused 72ms
04-24 08:26:34.158: D/skia(482): --- decoder->decode returned false
04-24 08:26:34.168: D/AndroidRuntime(482): Shutting down VM
04-24 08:26:34.168: W/dalvikvm(482): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-24 08:26:34.218: E/AndroidRuntime(482): FATAL EXCEPTION: main
04-24 08:34:37.807: E/AndroidRuntime(522): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
04-24 08:26:34.218: E/AndroidRuntime(482): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.KeySoft.OpenGuide/com.KeySoft.OpenGuide.Favourites}: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:284)
04-24 08:34:37.807: E/AndroidRuntime(522):  at com.KeySoft.OpenGuide.Top20.readBitmapImage(Top20.java:483)
04-24 08:34:37.807: E/AndroidRuntime(522):  at com.KeySoft.OpenGuide.Top20.addShopToList(Top20.java:251)
04-24 08:34:37.807: E/AndroidRuntime(522):  at com.KeySoft.OpenGuide.Top20.SqlShopsVissza(Top20.java:439)
04-24 08:34:37.807: E/AndroidRuntime(522):  at com.KeySoft.OpenGuide.Top20.onCreate(Top20.java:182)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.os.Looper.loop(Looper.java:130)
04-24 08:34:37.807: E/AndroidRuntime(522):  at android.app.ActivityThread.main(ActivityThread.java:3683)
04-24 08:34:37.807: E/AndroidRuntime(522):  at java.lang.reflect.Method.invokeNative(Native Method)
04-24 08:34:37.807: E/AndroidRuntime(522):  at java.lang.reflect.Method.invoke(Method.java:507)
04-24 08:34:37.807: E/AndroidRuntime(522):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-24 08:34:37.807: E/AndroidRuntime(522):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-24 08:34:37.807: E/AndroidRuntime(522):  at dalvik.system.NativeStart.main(Native Method)

我在模拟器上使用 256 MB 内存...也许我可以在真实设备上避免所有这些? 便宜的设备也至少有 384 MB 内存(Galaxy Mini),但通常更多...

【问题讨论】:

  • 这告诉你你正在使用内存。如果您的应用程序崩溃发布您收到的错误消息。这些只是关于垃圾收集和即时编译器的信息。很可能您使用了太多内存或有泄漏。
  • 我猜你正在使用大图像。某处与第 2 行的布局 xml 文件相关。由于每个应用程序的内存有限(例如 16MB),因此在使用图像时必须非常保守。 1 兆像素 (1000x1000) 的图像已经需要 4 兆字节的内存。
  • 我使用的是 800x480 图像。我怎样才能用更小的尺寸制作一个好的背景?如果我减半它会一样吗?
  • 这是由于超出了每个应用程序的内存限制。与 JIT 编译器无关。 hprof 和 Eclipse MAT 等工具可以帮助确定内存的去向。

标签: android memory-leaks jit dalvik


【解决方案1】:

正如你在评论I use a 800x480 image. How can i make a good background with smaller size ?中所问的那样

以下是允许您调整位图大小的 sn-p 代码。

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {

int width = bm.getWidth();

int height = bm.getHeight();

float scaleWidth = ((float) newWidth) / width;

float scaleHeight = ((float) newHeight) / height;

// create a matrix for the manipulation

Matrix matrix = new Matrix();

// resize the bit map

matrix.postScale(scaleWidth, scaleHeight);

// recreate the new Bitmap

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

return resizedBitmap;

}

【讨论】:

    【解决方案2】:

    问题 1: 它不是泄漏内存。 JitTable 用于存储 jni 参考。例如,当您调用 NewGlobalRef Api 时,JitTable 会增加 1 条记录。

    这个日志意味着 JitTable 不够,VM 会自动调整大小。所以不用担心,您只需保留正确的发布无用参考。没关系。

    问题 2:
    GC_EXTERNAL_ALLOC,当你分配本机内存但内存不够时,会调用GC。 GC_CONCURRENT,当你分配的对象大小大于 384K https://developer.android.com/tools/debugging/debugging-memory.html#LogMessages

    【讨论】:

      猜你喜欢
      • 2019-06-06
      • 1970-01-01
      • 2021-08-18
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多