Android jni 调用一开始不会oom,运行两三次出现OOM

wangyou_1987 2017-09-22 11:24:16
麻烦android 大神帮忙看一下,是什么问题?
09-22 03:07:04.315 1885-1888/com.pay.tms.tmsdes E/dalvikvm: adjustAdaptiveCoef max=8388608, min=2097152, ut=256
09-22 03:07:04.315 1885-1888/com.pay.tms.tmsdes D/dalvikvm: GC_CONCURRENT freed <1K, 36% free 38496K/59832K, paused 2ms+3ms, total 18ms
09-22 03:07:04.555 1885-1885/com.pay.tms.tmsdes I/tmsdes: 1-----[1506049624]
09-22 03:07:06.095 1885-1885/com.pay.tms.tmsdes I/tmsdes: 2-----[1506049626]
09-22 03:07:06.585 1885-1885/com.pay.tms.tmsdes I/tmsdes: 申请返回内存【17590623】
09-22 03:07:06.600 1885-1885/com.pay.tms.tmsdes D/dalvikvm: GC_FOR_ALLOC freed <1K, 36% free 38496K/59832K, paused 14ms, total 15ms
09-22 03:07:06.600 1885-1885/com.pay.tms.tmsdes I/dalvikvm-heap: Forcing collection of SoftReferences for 17590639-byte allocation
09-22 03:07:06.615 1885-1885/com.pay.tms.tmsdes D/dalvikvm: GC_BEFORE_OOM freed 0K, 36% free 38496K/59832K, paused 17ms, total 17ms
09-22 03:07:06.615 1885-1885/com.pay.tms.tmsdes E/dalvikvm-heap: Out of memory on a 17590639-byte allocation.
09-22 03:07:06.620 1885-1885/com.pay.tms.tmsdes I/dalvikvm: "main" prio=5 tid=1 RUNNABLE
09-22 03:07:06.620 1885-1885/com.pay.tms.tmsdes I/dalvikvm: | group="main" sCount=0 dsCount=0 obj=0x413b79a0 self=0x40dcd950
09-22 03:07:06.620 1885-1885/com.pay.tms.tmsdes I/dalvikvm: | sysTid=1885 nice=0 sched=0/0 cgrp=apps handle=1075095004
09-22 03:07:06.620 1885-1885/com.pay.tms.tmsdes I/dalvikvm: | state=R schedstat=( 10805841773 1353845084 6085 ) utm=860 stm=220 core=1
09-22 03:07:06.620 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at com.pay.tms.tmsdes.util.DesUtils.deszipfileh(Native Method)
09-22 03:07:06.630 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at com.pay.tms.tmsdes.MainActivity.onCreate(MainActivity.java:52)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.app.Activity.performCreate(Activity.java:5255)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.app.ActivityThread.access$700(ActivityThread.java:154)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.os.Looper.loop(Looper.java:137)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at android.app.ActivityThread.main(ActivityThread.java:5306)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at java.lang.reflect.Method.invokeNative(Native Method)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at java.lang.reflect.Method.invoke(Method.java:511)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
09-22 03:07:06.635 1885-1885/com.pay.tms.tmsdes I/dalvikvm: at dalvik.system.NativeStart.main(Native Method)
09-22 03:07:06.640 1885-1885/com.pay.tms.tmsdes I/tmsdes: 申请返回内存失败
09-22 03:07:06.650 1885-1885/com.pay.tms.tmsdes D/AndroidRuntime: Shutting down VM
09-22 03:07:06.650 1885-1885/com.pay.tms.tmsdes W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x413b6930)
09-22 03:07:06.675 1885-1885/com.pay.tms.tmsdes E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at com.pay.tms.tmsdes.util.DesUtils.deszipfileh(Native Method)
at com.pay.tms.tmsdes.MainActivity.onCreate(MainActivity.java:52)
at android.app.Activity.performCreate(Activity.java:5255)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
at android.app.ActivityThread.access$700(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5306)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
...全文
416 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 5 楼 wangyou_1987 的回复:
[quote=引用 4 楼 xiaohuh421 的回复:] 你只要保证传入的两个jbyteArry不会很大. 并且SHA_DIGEST_LENGTH 也不会很大. 那么从代码上, 确实看不出问题在哪里. 解决办法. 1. 确定是这个函数引起的. ----排除方法, 把函数的内容全部注释掉(返回值需要构造一个), 相当于空实现, 看是否仍然出问题. 如果不出问题了, 说明是这个函数引起 2. 如果确定是这个函数引用的, 那么就只能采用,分段注释法. 看是哪段代码导致的oom, 再辅助日志来看. 观察每次调用后, 内存的变化情况.
传入的jbyteArry 是整个文件可能有16M或者更大,还有一个应该是32位不长[/quote] 16M 肯定oom了
wangyou_1987 2017-09-23
  • 打赏
  • 举报
回复
引用 4 楼 xiaohuh421 的回复:
你只要保证传入的两个jbyteArry不会很大. 并且SHA_DIGEST_LENGTH 也不会很大. 那么从代码上, 确实看不出问题在哪里. 解决办法. 1. 确定是这个函数引起的. ----排除方法, 把函数的内容全部注释掉(返回值需要构造一个), 相当于空实现, 看是否仍然出问题. 如果不出问题了, 说明是这个函数引起 2. 如果确定是这个函数引用的, 那么就只能采用,分段注释法. 看是哪段代码导致的oom, 再辅助日志来看. 观察每次调用后, 内存的变化情况.
传入的jbyteArry 是整个文件可能有16M或者更大,还有一个应该是32位不长
xiaohuh421 2017-09-23
  • 打赏
  • 举报
回复
你只要保证传入的两个jbyteArry不会很大. 并且SHA_DIGEST_LENGTH 也不会很大. 那么从代码上, 确实看不出问题在哪里. 解决办法. 1. 确定是这个函数引起的. ----排除方法, 把函数的内容全部注释掉(返回值需要构造一个), 相当于空实现, 看是否仍然出问题. 如果不出问题了, 说明是这个函数引起 2. 如果确定是这个函数引用的, 那么就只能采用,分段注释法. 看是哪段代码导致的oom, 再辅助日志来看. 观察每次调用后, 内存的变化情况.
wangyou_1987 2017-09-22
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
上代码吧. .deszipfileh 这里面申请的内存过大, 导致OOM
(JNIEnv *env, jobject instance, jbyteArray inbuf1, jsize inlen, jbyteArray sha1) { int ret = 0, i = 0; int block = 0; long deslen = 0; long outlen = 0; long total = 0; unsigned char cshalen[11]; unsigned char cdatalen[21]; char sha3[50]; unsigned char odata[17]; unsigned char tmpdata[17]; char mdString[SHA_DIGEST_LENGTH * 2 + 1]; unsigned char *desdata = NULL; unsigned char *data = NULL; unsigned char *pdata = NULL; unsigned char *out = NULL; unsigned char key[17] ; des_context ctx; memset(sha3, 0, sizeof(sha3)); memset(odata, 0, sizeof(odata)); memset(tmpdata, 0, sizeof(tmpdata)); memset(cshalen, 0, sizeof(cshalen)); memset(cdatalen, 0, sizeof(cdatalen)); memset(mdString, 0, sizeof(mdString)); memset(key, 0, sizeof(key)); memcpy(key, "1234567890123456", 16); jbyte *inbuf = (*env)->GetByteArrayElements(env, inbuf1, NULL); jbyte *dsha = (*env)->GetByteArrayElements(env, sha1, NULL); jsize alen = inlen; ret = casha1(inbuf, alen, mdString); (*env)->ReleaseByteArrayElements(env, sha1, dsha, 0); block = 12; pdata = (unsigned char *) malloc(inlen + 1); desdata = (unsigned char *) malloc(inlen + 1); memset(desdata, 0, inlen); memset(pdata, 0, inlen + 1); memcpy(pdata, inbuf, inlen); (*env)->ReleaseByteArrayElements(env, inbuf1, inbuf, 0); time_t tm1; time(&tm1); sm4_setkey_dec(&ctx, key); LOGI("1-----[%ld]", tm1); for (循环) { memset(tmpdata, 0, sizeof(tmpdata)); memset(odata, 0, sizeof(odata)); memcpy(tmpdata, pdata + i * 16, 16); TODO解密解密 memcpy(desdata + i * 16, odata, 16); } time(&tm1); LOGI("2-----[%ld]", tm1); outlen = inlen; data = malloc(outlen + 1); memset(data, 0, sizeof(outlen + 1)); out = malloc(outlen +1); memcpy(data, desdata, outlen); free(pdata); free(desdata); memset(out, 0, sizeof(out)); memcpy(out , data, outlen); total = outlen; LOGI("申请返回内存【%d】", total); jbyteArray outdata = (*env)->NewByteArray(env, total); if (outdata == NULL) { LOGI("申请返回内存失败"); return NULL; } LOGI("申请成功"); (*env)->SetByteArrayRegion(env, outdata, 0, total, (jbyte *) out); LOGI("赋值成功"); (*env)->ReleaseByteArrayElements(env,outdata,out,0); free(out); free(data); time(&tm1); return outdata; }
jklwan 2017-09-22
  • 打赏
  • 举报
回复
上代码看看撒!
xiaohuh421 2017-09-22
  • 打赏
  • 举报
回复
上代码吧. .deszipfileh 这里面申请的内存过大, 导致OOM

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧