我面临着一个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"
}
1条答案
按热度按时间l0oc07j21#
堆栈跟踪有多长时间?- 我想你可能有递归缺陷
如果有一个
IOException
,那么你的异常处理调用debug
方法,我认为(我看不到所有的代码)递归再次调用writeFile
,如果另一个IOException
失败,那么它将循环。请注意,msg
每次都会增长...在极限情况下,这将为堆空间的增长留出空间。你调查的下一步改变
到
即不包括
msg
,则msg
中的爆炸不会发生。或者考虑不使用自定义记录器记录此事件。