Git Product home page Git Product logo

koom's Introduction

license Platform

KOOM

An OOM killer on mobile platform by Kwai.

中文版本请参看这里

Introduction

KOOM creates a mobile high performance online memory monitoring solution,which supplies a detailed report when OOM related problems are detected, and has solved a large number of OOM issues in the Kwai application. It's currently available on Android.

With the increasing complexity of mobile terminal business logic and the gradual popularity of scenarios with high memory requirements such as 4K codec and AR magic watch, the OOM problem has become the number one problem in the stability management of the Kuaishou client. In the daily version iteration process, OOM surges occasionally occur, and the online environment is very complicated. There are thousands of AB experiments. Pre-prevention and post-recovery cannot be achieved. Therefore, high-performance online memory monitoring solutions are urgently needed.

So how should OOM governance be built? At present, KOOM has the capability of monitoring leakage of Java Heap/Native Heap/Thread, and will build multi-dimensional and multi-business scenarios monitoring in the future.

Features

Java Leak Monitor

  • The koom-java-leak module is used for Java Heap leak monitoring: it uses the Copy-on-write mechanism to fork the child process dump Java Heap, which solves the problem. The app freezes for a long time during the dump. For details, please refer to here

Native Leak Monitor

  • The koom-native-leak module is a Native Heap leak monitoring solution: use the Tracing garbage collection mechanism to analyze the entire Native Heap, and directly output the leaked memory information like: size/Allocating stacks/etc.; greatly reduces the cost of analyzing and solving memory leaks for business students. For details, please refer to here

Thread Leak Monitor

  • The koom-thread-leak module is used for Thread leak monitoring: it hooks the life cycle function of the thread, and periodically reports the leaked thread information. For details, please refer to here

STL Support

All Native modules support two access modes, c++_shared and c++_static. For details, please refer to cpp-support.

  • Add dependency to the project build.gradle (take koom-java-leak as an example):
dependencies {
  // In shared mode, multiple modules share the same libc++_shared.so (STL), and the package 
  // size is small, but when multiple modules depend on different STL versions, the final 
  // compilation will conflict. For example, you might get "dlopen failed: cannot locate symbol
  // "__emutls_get_address" referenced by" errors.
  implementation "com.kuaishou.koom:koom-java-leak:${latest_version}"
  // Or in static mode, each module has its own STL, the package size is large, and there are no 
  // compilation and runtime problems.
  implementation "com.kuaishou.koom:koom-java-leak-static:${latest_version}"
  // If you depend on multiple modules, the shared and static modes cannot be mixed. 
  // The following way is wrong, remember!
  implementation "com.kuaishou.koom:koom-java-leak-static:${latest_version}"
  implementation "com.kuaishou.koom:koom-monitor-base:${latest_version}"
}
  • Introduce a way to resolve the conflict of shared mode, add pickFirst in the project root directory build.gradle:
packagingOptions {
  // Select the first libc++_shared.so when packaging apk, it may encounter unpredictable bugs 
  // at runtime, use it with caution!
  pickFirst 'lib/*/libc++_shared.so'
}

minSdk

  • The minSdk of all modules is 18. If the minSdk of your app is lower than that, it needs to be compatible with overrideLibrary in the manifest.
  <uses-sdk tools:overrideLibrary="com.kwai.koom.fastdump, com.kwai.android.base, com.kwai.koom.base" />

License

KOOM is under the Apache license 2.0. For details check out the LICENSE.

Change Log

Check out the CHANGELOG.md for details of change history.

Contributing

If you are interested in contributing, check out the CONTRIBUTING.md

Feedback

Welcome report issues or contact us in WeChat group.

koom's People

Contributors

alhah avatar androidinternal avatar awangami avatar lbtrace avatar madroidmaq avatar mr-jingshi avatar testplanb avatar zefengsysu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

koom's Issues

NullPointerException Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference

1 java.lang.RuntimeException:Unable to create application booter.ReleaseApp: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference

2 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4986)
3 ......
4 java.lang.NullPointerException:Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference
5 com.kwai.koom.javaoom.common.KConfig$KConfigBuilder.void ()(SourceFile:6)
6 com.kwai.koom.javaoom.common.KConfig.com.kwai.koom.javaoom.common.KConfig defaultConfig()(SourceFile:1)
7 com.kwai.koom.javaoom.KOOMInternal.void buildConfig(android.app.Application)(SourceFile:2)
8 com.kwai.koom.javaoom.KOOMInternal.void (android.app.Application)(SourceFile:3)
9 com.kwai.koom.javaoom.KOOM.void (android.app.Application)(SourceFile:3)
10 com.kwai.koom.javaoom.KOOM.void init(android.app.Application)(SourceFile:6)
12 booter.App.void onCreate()(SourceFile:21)
13 android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1022)
14 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4983)
15 android.app.ActivityThread.-wrap1(ActivityThread.java)
16 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1560)
17 android.os.Handler.dispatchMessage(Handler.java:111)
18 android.os.Looper.loop(Looper.java:207)
19 android.app.ActivityThread.main(ActivityThread.java:5778)
20 java.lang.reflect.Method.invoke(Native Method)
21 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
22 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691)

非androidX接入报错

Program type already present: android.support.v4.app.INotificationSideChannel$Stub$Proxy
Error: Program type already present: android.support.v4.app.INotificationSideChannel$Stub$Proxy

README tag 没更新?

README 首行的 release tag 显示的是 1.0.0,但是最新的 release 版本是 1.0.4 吧

一些机型出现crash异常

sdk版本:1.0.4
异常堆栈:
java.lang.IllegalArgumentException:
at android.os.StatFs.doStat (StatFs.java:51)
at android.os.StatFs. (StatFs.java:41)
at com.kwai.koom.javaoom.common.KUtils.getSpaceInGB (KUtils.java:57)
at com.kwai.koom.javaoom.KOOMEnableChecker.isSpaceEnough (KOOMEnableChecker.java:85)
at com.kwai.koom.javaoom.KOOMEnableChecker.doCheck (KOOMEnableChecker.java:133)
at com.kwai.koom.javaoom.KOOMInternal.startInternal (KOOMInternal.java:99)
at com.kwai.koom.javaoom.-$$Lambda$0djp1uDEn8XhoKOAxawfvgrwyEU.run (-.java:2)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:226)
at android.os.HandlerThread.run (HandlerThread.java:65)

监控内存策略

关于java堆内存监控策略,想知道为何你们的策略是这样
image
理论上不是应该内存越小,阀值百分比预留越大嘛,对于低内存设备应该预留更多内存吧,这里为何是反过来的

java.lang.UnsatisfiedLinkError: dlopen failed: library "libkoom-java.so" not found

环境:

  • ndk 16.1.4479499
  • 设备 模拟器 api30
  • 系统 mac

步骤:
git clone 项目
master分支,运行demo

2020-12-15 10:45:20.980 31164-31164/com.kwai.koom.demo W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: library "libkoom-java.so" not found
2020-12-15 10:45:20.980 31164-31164/com.kwai.koom.demo W/System.err:     at java.lang.Runtime.loadLibrary0(Runtime.java:1087)
2020-12-15 10:45:20.981 31164-31164/com.kwai.koom.demo W/System.err:     at java.lang.Runtime.loadLibrary0(Runtime.java:1008)
2020-12-15 10:45:20.981 31164-31164/com.kwai.koom.demo W/System.err:     at java.lang.System.loadLibrary(System.java:1664)
2020-12-15 10:45:20.981 31164-31164/com.kwai.koom.demo W/System.err:     at com.kwai.koom.javaoom.common.DefaultKSoLoader.loadLib(DefaultKSoLoader.java:25)
2020-12-15 10:45:20.981 31164-31164/com.kwai.koom.demo W/System.err:     at com.kwai.koom.javaoom.dump.ForkJvmHeapDumper.<init>(ForkJvmHeapDumper.java:39)
2020-12-15 10:45:20.981 31164-31164/com.kwai.koom.demo W/System.err:     at com.kwai.koom.javaoom.dump.HeapDumpTrigger.<init>(HeapDumpTrigger.java:43)
2020-12-15 10:45:20.981 31164-31164/com.kwai.koom.demo W/System.err:     at com.kwai.koom.javaoom.KOOMInternal.<init>(KOOMInternal.java:60)
2020-12-15 10:45:20.982 31164-31164/com.kwai.koom.demo W/System.err:     at com.kwai.koom.javaoom.KOOM.<init>(KOOM.java:43)
2020-12-15 10:45:20.982 31164-31164/com.kwai.koom.demo W/System.err:     at com.kwai.koom.javaoom.KOOM.init(KOOM.java:62)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at com.kwai.koom.demo.KOOMApplication.onCreate(KOOMApplication.java:34)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6712)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at android.app.ActivityThread.access$1300(ActivityThread.java:237)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at android.os.Looper.loop(Looper.java:223)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7656)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
2020-12-15 10:45:20.986 31164-31164/com.kwai.koom.demo W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Thread starting during runtime shutdown com.kwai.koom.javaoom.common.KVData.void init()(SourceFile:2)

1 java.lang.Thread.nativeCreate(Native Method)

2 java.lang.Thread.start(Thread.java:1063)
3 android.app.SharedPreferencesImpl.startLoadFromDisk(SharedPreferencesImpl.java:88)
4 android.app.SharedPreferencesImpl.(SharedPreferencesImpl.java:81)
5 android.app.ContextImpl.getSharedPreferences(ContextImpl.java:358)
6 android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:171)
7 com.kwai.koom.javaoom.common.KVData.void init()(SourceFile:2)
8 com.kwai.koom.javaoom.common.KVData.long firstLaunchTime(java.lang.String)(SourceFile:2)
9 com.kwai.koom.javaoom.KOOMEnableChecker.boolean isDateExpired()(SourceFile:2)
10 com.kwai.koom.javaoom.KOOMEnableChecker.com.kwai.koom.javaoom.KOOMEnableChecker$Result doCheck()(SourceFile:7)
11 com.kwai.koom.javaoom.KOOMInternal.void startInternal()(SourceFile:6)
12 com.kwai.koom.javaoom.-$$Lambda$0djp1uDEn8XhoKOAxawfvgrwyEU.run(lambda)
13 android.os.Handler.handleCallback(Handler.java:739)
14 android.os.Handler.dispatchMessage(Handler.java:95)
15 android.os.Looper.loop(Looper.java:148)
16 android.os.HandlerThread.run(HandlerThread.java:61)

dump进程出现了SIGSEGV(SEGV_ACCERR)

你好,我们在使用KOOM的时候,ret = ForkJvmHeapDumper().dump(hprofPath),调用这句代码dump内存快照的时候,在Android 10系统上面出现比较多的SIGSEGV(SEGV_ACCERR)crash上报。看日志,出现的进程都是dump进程,不影响主进程。内存快照也正常dump了,就是上报了这个crash。帮看下什么原因?
Build fingerprint: HONOR/JSN-AL00/HWJSN-H:10/HONORJSN-AL00/10.0.0.168C00:user/release-keys Revision: 0 ABI: arm64 time: 2021-03-12 03:00:17 pid: 25770, tid: 25770, name: main >>> com.xxx.xxxx <<< signal: 11 (SIGSEGV), code: 2 (SEGV_ACCERR) fault addr: 0x1513c830 si_errno:0, si_errnoMsg:Success, sending pid:0, sending uid:0 r0: 0x000000007091fac8 r1: 0x000000001446b090 r2: 0x000000001513c828 r3: 0x000000007080fdb0 r4: 0x0000000000000e0a r5: 0x0000000000000030 r6: 0x0000000000000f60 r7: 0x0000000000000010 r8: 0x0000000000000018 r9: 0x000000009d4db9b0 r10: 0x00000079f7b13691 r11: 0x0000007a65546448 r12: 0x0000007a6554649c r13: 0x0000007a655464f0 r14: 0x0000007a65546550 r15: 0x000000001434aee8 r16: 0x0000000000000000 r17: 0x00000000000511ac r18: 0x000000793c13a000 r19: 0x00000078fba95000 r20: 0x0000000000000000 r21: 0x000000001513c828 r22: 0x000000001446b090 r23: 0x000000001513c828 r24: 0x000000001446afb0 r25: 0x000000798f921020 r26: 0x00000078fba950b0 r27: 0x0000000000000002 r28: 0x000000000000000a r29: 0x000000798f91e770 r30: 0x000000009d4d58b0 sp: 0x000000798f91e650 pc: 0x0000000071de7d1c pstate: 0x0000000080000000 #00 pc 00000000002f8d1c /system/framework/arm64/boot.oat [arm64-v8a::24b2f2282cb8494eaee96585e10f68d8] #01 pc 000000009d4d58ac <unknown>

Fork子进程问题

请教一个问题,我如果想单纯的实现fork子进程dump功能,我需要copy项目中的哪一个模块呢,因为我不想导入整一个KOOM项目。

java.lang.NullPointerException

@Override
public void run() {
  if (stop) {
    return;
  }

  if (KConstants.Debug.VERBOSE_LOG) {
    Log.i(TAG, monitor.monitorType() + " monitor run");
  }

  if (monitor.isTrigger()) {
    Log.i(TAG, monitor.monitorType() + " monitor "
        + monitor.monitorType() + " trigger");
    stop = monitorTriggerListener
        .onTrigger(monitor.monitorType(), monitor.getTriggerReason());
  }

  if (!stop) {
    handler.postDelayed(this, monitor.pollInterval());
  }
}

java.lang.NullPointerException
Attempt to invoke interface method 'boolean com.kwai.koom.javaoom.monitor.MonitorTriggerListener.onTrigger(com.kwai.koom.javaoom.monitor.MonitorType, com.kwai.koom.javaoom.monitor.TriggerReason)' on a null object reference

请问KOOM有自动监控并分析的功能吗?

Demo里面是在KOOM.manualTrigger()中主动去抓取hprof文件并分析然后生成报告的,那么,如果我不主动去调用此函数,看逻辑应该是在内存超过阈值3次之后去抓取的,对吗?
另外,还有一个疑问,App在打开过程中,只能抓取一次数据吗?当我尝试重复调用KOOM.manualTrigger()时,好像并不起作用啊。
望解答,谢谢!

关于ForkJvmHeapDumper的疑问

我看到ForkJvmHeapDumper中主要是三步
trySuspendVMThenFork();
resumeVM()
waitDumping
fork进程后,并没有发现子进程dump相关的api调用,有点不太理解。子进程会自动dump吗?

然后可以更新一下群二维码吗

请教下jni fork如何能返回两次pid

我自己写demo试了下只能在主进程返回pid>0的打印,子进程是僵尸进程状态,并没有fork成功。但是koom是正常返回两次的,然后就想请教下是怎么做到的

接入直接crash 是什么情况

Process: com.example.yaningzhang.androidkoom, PID: 29160
                                               java.lang.VerifyError: Verifier rejected class com.kwai.koom.javaoom.KOOMInternal: void com.kwai.koom.javaoom.KOOMInternal.startInKOOMThread() failed to verify: void com.kwai.koom.javaoom.KOOMInternal.startInKOOMThread(): [0x2] Call site #1 bootstrap return type is not a referenceVerifier rejected class com.kwai.koom.javaoom.KOOMInternal: void com.kwai.koom.javaoom.KOOMInternal.manualTrigger() failed to verify: void com.kwai.koom.javaoom.KOOMInternal.manualTrigger(): [0x2] Call site #2 bootstrap return type is not a reference
                                                void com.kwai.koom.javaoom.KOOMInternal.manualTriggerOnCrash() failed to verify: void com.kwai.koom.javaoom.KOOMInternal.manualTriggerOnCrash(): [0x2] Call site #3 bootstrap return type is not a reference (declaration of 'com.kwai.koom.javaoom.KOOMInternal' appears in /data/app/com.example.yaningzhang.androidkoom-VgH3DPIEOyn-OV08WGskRQ==/base.apk)
                                                   at com.kwai.koom.javaoom.KOOM.<init>(KOOM.java:43)
                                                   at com.kwai.koom.javaoom.KOOM.init(KOOM.java:62)
                                                   at com.example.yaningzhang.androidkoom.KoomApplication.onCreate(KoomApplication.java:22)
                                                   at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1120)
                                                   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5826)
                                                   at android.app.ActivityThread.-wrap1(Unknown Source:0)
                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1685)
                                                   at android.os.Handler.dispatchMessage(Handler.java:106)
                                                   at android.os.Looper.loop(Looper.java:176)
                                                   at android.app.ActivityThread.main(ActivityThread.java:6651)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

08-12 11:17:42.837 29160-29160/? I/Process: Sending signal. PID: 29160 SIG: 9

!分割线
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation deps.androidx.appcompat
implementation deps.androidx.constraintlayout
implementation deps.material
implementation 'com.kwai.koom:java-oom:1.0.4'
}
这个是我的配置

OPPO、VIVO KUtils.getSpaceInGB崩溃 statvfs failed: ENOENT (No such file or directory)

OPPO、VIVO出现大量目录异常崩溃,使用自定义路径同样崩溃

默认路径:java.lang.IllegalArgumentException:Invalid path: /data/data/xxx/cache/koom
自定义路径:java.lang.IllegalArgumentException:Invalid path: /storage/emulated/0/Android/data/xxx/files/oom

statvfs failed: ENOENT (No such file or directory)
com.kwai.koom.javaoom.common.KUtils.float getSpaceInGB(java.lang.String)(SourceFile:1)

1 java.lang.IllegalArgumentException:Invalid path: /storage/emulated/0/Android/data/xxx/files/oom

2 android.os.StatFs.doStat(StatFs.java:53)
3 ......
4 android.system.ErrnoException:statvfs failed: ENOENT (No such file or directory)
5 libcore.io.Linux.statvfs(Native Method)
6 libcore.io.ForwardingOs.statvfs(ForwardingOs.java:224)
7 libcore.io.BlockGuardOs.statvfs(BlockGuardOs.java:396)
8 libcore.io.ForwardingOs.statvfs(ForwardingOs.java:224)
9 android.system.Os.statvfs(Os.java:660)
10 android.os.StatFs.doStat(StatFs.java:51)
11 android.os.StatFs.(StatFs.java:43)
12 com.kwai.koom.javaoom.common.KUtils.float getSpaceInGB(java.lang.String)(SourceFile:1)
13 com.kwai.koom.javaoom.KOOMEnableChecker.boolean isSpaceEnough()(SourceFile:2)
14 com.kwai.koom.javaoom.KOOMEnableChecker.com.kwai.koom.javaoom.KOOMEnableChecker$Result doCheck()(SourceFile:5)
15 com.kwai.koom.javaoom.KOOMInternal.void startInternal()(SourceFile:6)
16 com.kwai.koom.javaoom.KOOMInternal.void lambda$4g_V3sFLeyJdaTqLAVnSM2d0x_4(com.kwai.koom.javaoom.KOOMInternal)(Unknown Source:0)
17 com.kwai.koom.javaoom.-$$Lambda$KOOMInternal$4g_V3sFLeyJdaTqLAVnSM2d0x_4.run(Unknown Source:2)
18 android.os.Handler.handleCallback(Handler.java:883)
19 android.os.Handler.dispatchMessage(Handler.java:100)
20 android.os.Looper.loop(Looper.java:238)
21 android.os.HandlerThread.run(HandlerThread.java:67)

分析hprof的时候出现问题

10-27 20:58:29.309 11841 11868 I HeapAnalyzer: analyze
10-27 20:58:29.309 11841 11868 I LeaksFinder: build index file:/data/user/0/com.kwai.koom.demo/cache/koom/hprof/2020-10-27_20-58-28.hprof
10-27 20:58:29.742 11841 11868 W System.err: java.lang.IllegalStateException: Unknown tag 0x88 at 3379433 after 0x23 at 3379369
10-27 20:58:29.743 11841 11868 W System.err: at kshark.HprofReader.readHprofRecords(HprofReader.kt:446)
10-27 20:58:29.743 11841 11868 W System.err: at kshark.internal.HprofInMemoryIndex$Companion.createReadingHprof(HprofInMemoryIndex.kt:377)
10-27 20:58:29.743 11841 11868 W System.err: at kshark.HprofHeapGraph$Companion.indexHprof(HprofHeapGraph.kt:244)
10-27 20:58:29.743 11841 11868 W System.err: at com.kwai.koom.javaoom.analysis.SuspicionLeaksFinder.buildIndex(SuspicionLeaksFinder.java:205)
10-27 20:58:29.743 11841 11868 W System.err: at com.kwai.koom.javaoom.analysis.SuspicionLeaksFinder.find(SuspicionLeaksFinder.java:88)
10-27 20:58:29.744 11841 11868 W System.err: at com.kwai.koom.javaoom.analysis.KHeapAnalyzer.analyze(KHeapAnalyzer.java:44)
10-27 20:58:29.744 11841 11868 W System.err: at com.kwai.koom.javaoom.analysis.HeapAnalyzeService.doAnalyze(HeapAnalyzeService.java:113)
10-27 20:58:29.744 11841 11868 W System.err: at com.kwai.koom.javaoom.analysis.HeapAnalyzeService.onHandleIntent(HeapAnalyzeService.java:85)
10-27 20:58:29.744 11841 11868 W System.err: at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:76)
10-27 20:58:29.744 11841 11868 W System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
10-27 20:58:29.745 11841 11868 W System.err: at android.os.Looper.loop(Looper.java:223)
10-27 20:58:29.745 11841 11868 W System.err: at android.os.HandlerThread.run(HandlerThread.java:65)

trySuspendVMThenFork 什么场景会返回 0 呢?

    try {
      int pid = trySuspendVMThenFork();
      if (pid == 0) {
        Debug.dumpHprofData(path);
        KLog.i(TAG, "notifyDumped:" + dumpRes);
        //System.exit(0);
        exitProcess();
      } else {
        resumeVM();
        dumpRes = waitDumping(pid);
        KLog.i(TAG, "hprof pid:" + pid + " dumped: " + path);
      }

    } catch (IOException e) {
      e.printStackTrace();
      KLog.e(TAG, "dump failed caused by IOException!");
    }

trySuspendVMThenFork 什么场景会返回 0 呢?fork 返回值是不是只有在子进程下进行才会返回0,但是我们 KOOM 都是运行在主进程的呀?这一点不太理解,还望解答😁 @AndroidInternal

关于RetainedSize大小

请教下,我看了下你们对Shar进行了优化,目前能获得某个对象的RetainedSize吗?

分析报错 用的是StripHprofHeapDumper 组件这种方式dump的内存镜像 HUWEI FLA-AL20 android9 必现 应该是hook写入的时候有点问题

020-12-16 17:03:55.722 32550-32578/com.kwai.koom.demo I/LeaksFinder: build index file:/data/user/0/com.kwai.koom.demo/cache/koom/hprof/2020-12-16_17-03-51.hprof
2020-12-16 17:03:56.146 32550-32578/com.kwai.koom.demo W/System.err: java.lang.IllegalStateException: Unknown tag 0x0d at 3792519 after 0x08 at 3792506
2020-12-16 17:03:56.146 32550-32578/com.kwai.koom.demo W/System.err: at kshark.HprofReader.readHprofRecords(HprofReader.kt:446)
2020-12-16 17:03:56.146 32550-32578/com.kwai.koom.demo W/System.err: at kshark.internal.HprofInMemoryIndex$Companion.createReadingHprof(HprofInMemoryIndex.kt:377)
2020-12-16 17:03:56.146 32550-32578/com.kwai.koom.demo W/System.err: at kshark.HprofHeapGraph$Companion.indexHprof(HprofHeapGraph.kt:244)
2020-12-16 17:03:56.147 32550-32578/com.kwai.koom.demo W/System.err: at com.kwai.koom.javaoom.analysis.SuspicionLeaksFinder.buildIndex(SuspicionLeaksFinder.java:205)
2020-12-16 17:03:56.147 32550-32578/com.kwai.koom.demo W/System.err: at com.kwai.koom.javaoom.analysis.SuspicionLeaksFinder.find(SuspicionLeaksFinder.java:88)
2020-12-16 17:03:56.147 32550-32578/com.kwai.koom.demo W/System.err: at com.kwai.koom.javaoom.analysis.KHeapAnalyzer.analyze(KHeapAnalyzer.java:44)
2020-12-16 17:03:56.

想把KOOM接入到我们项目线上监控

想把KOOM接入到我们项目线上监控, 想了解快手那边在线上监控指标有哪些、采集hprof性能、以及线上采集策略等一些情况。(二维码过期)

还有比如, 触发时机:
出现OOM -> hprof
泄露 -> hprof
LowMemory -> hprof

公司项目集成了leakcanary,再集成KOOM闪退

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/leakcanary/core/R$bool;
at leakcanary.internal.InternalLeakCanary.addDynamicShortcut(InternalLeakCanary.kt:176)
at leakcanary.internal.InternalLeakCanary.invoke(InternalLeakCanary.kt:141)
at leakcanary.internal.InternalLeakCanary.invoke(InternalLeakCanary.kt:38)
at leakcanary.internal.InternalAppWatcher.install(InternalAppWatcher.kt:76)
at leakcanary.internal.AppWatcherInstaller.onCreate(AppWatcherInstaller.kt:35)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1925)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1900)
at android.app.ActivityThread.installProvider(ActivityThread.java:6578)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:6133)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6043)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1764)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.squareup.leakcanary.core.R$bool" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/org.simalliance.openmobileapi.jar", zip file

KOOM初始化异常

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xxxxs-7DlxCmcOrGT5VMbQmVIHzg==/base.apk"],nativeLibraryDirectories=[/data/app/xxxxx-7DlxCmcOrGT5VMbQmVIHzg==/lib/arm, /data/app/xxxxx-7DlxCmcOrGT5VMbQmVIHzg==/base.apk!/lib/armeabi, /system/lib, /hw_product/lib]]] couldn't find "libkoom-java.so"
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1067)
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at java.lang.System.loadLibrary(System.java:1668)
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at com.kwai.koom.javaoom.common.DefaultKSoLoader.loadLib(DefaultKSoLoader.java:25)
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at com.kwai.koom.javaoom.dump.ForkJvmHeapDumper.(ForkJvmHeapDumper.java:39)
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at com.kwai.koom.javaoom.dump.HeapDumpTrigger.(HeapDumpTrigger.java:43)
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at com.kwai.koom.javaoom.KOOMInternal.(KOOMInternal.java:60)
2021-04-14 11:52:55.230 21426-21577/com.xiwei.logistics W/System.err: at com.kwai.koom.javaoom.KOOM.(KOOM.java:43)
2021-04-14 11:52:55.231 21426-21577/com.xiwei.logistics W/System.err: at com.kwai.koom.javaoom.KOOM.init(KOOM.java:62)

有个疑问啊

image
fork dump和strip dump是不是只能选择一种 ,没有fork dump 和strip dump 一起使用?

1.0.7

当前载入的1.0.7是没有适配android N的,啥时候更新一个版本吧。

建议开放KOOM初始化时的设备最低存储空间容量检测自定义配置功能

建议开放KOOM初始化时的设备最低存储空间容量检测自定义配置功能。因想将该库引入设备端程序,设备端程序的可用存储空间可能低于5GB,对于设备端来说,门槛太高,建议开发参数配置,由开发者自行决定最低门槛。

目前源码看出可用空间必须大于5GB才允许初始化
/**

  • Koom runs when disk space is enough.
  • @return enough
    */
    public boolean isSpaceEnough() {
    String dir = KGlobalConfig.getRootDir();
    float space = KUtils.getSpaceInGB(dir);
    if (KConstants.Debug.VERBOSE_LOG) {
    KLog.i("koom", "Disk space:" + space + "Gb");
    }
    return space > KConstants.Disk.ENOUGH_SPACE_IN_GB;
    }

koom文件夹中没有任何report 文件

按照文档说明接入KOOM 后,测试好久,发现koom文件夹中没有任何文件,手动调用KOOM.getInstance().manualTrigger() 也没解决,请问是什么问题,
com.kwai.koom:java-oom:1.0.7

LeakedClosableObjects(资源对象正确关闭)问题

报告一个今天自动化测试工具跑出来的LeakedClosableObjects(资源对象正确关闭)问题

Process: com.flyme.videoclips:heap_analysis PID: 21396 Flags: 0x38883e44 Package: com.flyme.videoclips v2014000 (2.14.0) Build: Meizu/meizu_16X_CN/16X:8.1.0/OPM1.171019.026/1572938190:user/release-keys System-App: false Uptime-Millis: 1632973 java.lang.Throwable: Explicit termination method 'close' not called at dalvik.system.CloseGuard.open(CloseGuard.java:223) at java.io.FileInputStream.<init>(FileInputStream.java:156) at kshark.Hprof$Companion.open(SourceFile:71) at com.kwai.koom.javaoom.analysis.SuspicionLeaksFinder.buildIndex(SourceFile:194) at com.kwai.koom.javaoom.analysis.SuspicionLeaksFinder.find(SourceFile:88) at com.kwai.koom.javaoom.analysis.KHeapAnalyzer.analyze(SourceFile:44) at com.kwai.koom.javaoom.analysis.HeapAnalyzeService.doAnalyze(SourceFile:113) at com.kwai.koom.javaoom.analysis.HeapAnalyzeService.onHandleIntent(SourceFile:85) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:76) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:192) at android.os.HandlerThread.run(HandlerThread.java:65) A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.

关于bitmap泄漏判定规则的疑问

我看到源码的规则是当bitmap的大小超过DEFAULT_BIG_BITMAP时,就判断该bitmap发生了泄漏,这个不一定吧。如果当前页面展示了一个超过DEFAULT_BIG_BITMAP大小的图片时,这个图片会判断为泄漏么?还是说这里只是把当前的大图片给过滤出来,是否为泄漏还得另外判断? @AndroidInternal

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.