将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?
Posted
技术标签:
【中文标题】将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?【英文标题】:Is it more efficient to convert an exception's stack trace into byte[] array or ByteBuffer (Java)?将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是否更有效? 【发布时间】:2012-09-19 17:06:47 【问题描述】:我需要将异常记录到数据库中。数据库 API 声明我可以将值作为 ByteBuffer 或 byte[] 数组传递。那么哪个更高效呢?
private final static byte[] getThrowableStackTraceBytes(Throwable throwable)
StringWriter throwableStackTraceStringWriter = new StringWriter();
throwable.printStackTrace(new PrintWriter(throwableStackTraceStringWriter));
return throwableStackTraceStringWriter.toString().getBytes();
对比
private final static ByteBuffer getThrowableStackTraceByteBuffer(Throwable throwable)
ByteArrayOutputStream throwableStackTraceByteArrayOutputStream = new ByteArrayOutputStream();
throwable.printStackTrace(new PrintStream(throwableStackTraceByteArrayOutputStream));
ByteBuffer throwableByteBuffer = ByteBuffer.wrap(throwableStackTraceByteArrayOutputStream.toByteArray());
return throwableByteBuffer;
我认为如果我使用 ByteBuffer,整体操作会更有效率,尤其是在它被传递到数据库方法之后进行处理时。我说的对吗?
(具体来说,我需要将异常记录到 Hypertable 中,它使用 Thrift Java API。)
【问题讨论】:
您是否尝试过对差异进行基准测试?这是您的应用程序中的一个重大瓶颈吗? 你为什么要使用字节?堆栈跟踪不是更自然地存储为字符串吗?另外,为什么要关注效率?如果您获得足够多的例外以使效率成为问题,那么您将遇到更大的问题。而是解决这些问题。 目前还没有瓶颈或效率问题。我刚刚开始编写服务器应用程序。正确记录所有异常只是一个好习惯。 好吧,我刚刚检查了数据库 API。传递 byte[] 数组或 ByteBuffer 将是相同的,因为前者将被包装到 ByteBuffer 中。 我同意性能和日志记录异常都很重要。但是日志记录异常的性能可能不如该日志记录代码的其他方面重要。您在日志记录方面的努力可能会更好地用于捕获正确信息、使其可靠、快速进行非异常日志记录等事情。 【参考方案1】:最有效的选择是两者的结合。
private final static byte[] getThrowableStackTraceBytes(Throwable throwable)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
throwable.printStackTrace(new PrintStream(baos));
return baos.toByteArray();
虽然我怀疑将其写入数据库会贵很多倍。
【讨论】:
返回方法“return baos.toByteArray();” - 返回 byte[] - 不起作用,因为返回类型是 ByteBuffer。以上是关于将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Byte 数组转换为 PrivateKey 或 PublicKey 类型?
引发类型为“System.OutOfMemoryException”的异常。