android 使用FileOutputStream写入文件时发生OutOfMemoryError

tkclm6bt  于 2023-05-05  发布在  Android
关注(0)|答案(1)|浏览(268)

我面临着一个OutOfMemoryError,而写的文件是不可复制的每一次,但它经常发生的少数用户,我得到了下面的错误,而检查日志。

2023-05-03 12:11:11.257 6986-6986/com.example.dev E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.dev, PID: 6986 java.lang.OutOfMemoryError: Failed to allocate a 265048 byte allocation with 96648 free bytes and 94KB until OOM, max allowed footprint 201326592, growth limit 201326592 at java.util.Arrays.copyOf(Arrays.java:3260) 
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:125) 
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:451) 
at java.lang.StringBuilder.append(StringBuilder.java:137) 
at com.TestTracLogger.formatLog(TestTracLogger:97) 
at com.TestTracLogger.writeFile(TestTracLogger:86) 
at com.TestTracLogger.debug(TestTracLogger:64) 
at com.ITestTracLoggerRepresentable$DefaultImpls.debug$default(ITestTracLoggerRepresentable.kt:8) 
at com.TestTracLogger.writeFile(TestTracLogger:90)

而这种错误正在无限地发生。下面提到的代码指出了问题所在。

private fun writeFile(tag: String, msg: String, exception: Throwable?) {
    try {
        if (logFileOutputStream != null) {
            logFileOutputStream.write(formatLog(msg).toByteArray())
            logFileOutputStream.flush()
        }
    } catch (e: IOException) {
        debug(TAG, "Error in writing log i.e.($msg) to file " + e.message)
    }
}

private fun formatLog(msg: String): String {
    val dateTime: String =
        DateFormatterUtility.formatDateTimeToString(Date(), "MM/dd/yyyy HH:mm:ss.SSS")
    return "$dateTime : $msg \n"
}
l0oc07j2

l0oc07j21#

堆栈跟踪有多长时间?- 我想你可能有递归缺陷
如果有一个IOException,那么你的异常处理调用debug方法,我认为(我看不到所有的代码)递归再次调用writeFile,如果另一个IOException失败,那么它将循环。请注意,msg每次都会增长...在极限情况下,这将为堆空间的增长留出空间。
你调查的下一步改变

debug(TAG, "Error in writing log i.e.($msg) to file " + e.message)

debug(TAG, "Error in writing log: " + e.message)

即不包括msg,则msg中的爆炸不会发生。或者考虑不使用自定义记录器记录此事件。

相关问题