我正在使用verbosegc
捕获一些数据并尝试分析我的应用程序的内存使用情况。
我有一个模块将从数据库或第三方中提取数据并将其放入列表对象中,然后仅返回到前端进行显示。
当我选择日期为日期范围时,它将从数据库中提取数据。当我选择今天的日期时,我的应用程序将向MQ
服务器发送请求,服务器将用消息MQ
响应我的应用程序。xml
我将使用 Apache camel 库来处理它。
如您所见,每次触发搜索功能时,内存使用量都会增加,然后回落。所以这是正常的,也是我所期望的。
这是verbosegc
从第三方提取数据时的屏幕截图。如你所见,内存增加后,它会在那里水平一段时间,然后才回落。
我怀疑 org.apache.camel.Exchange 或 org.apache.camel.Message 或 Apache 中的那些对象将持有内存更长时间。
这是我处理xml
来自第三方的消息的一些代码:
/**
* Camel Exchange producer template
*/
protected ProducerTemplate< Exchange > template;
@SuppressWarnings("unchecked")
private < T > T doSend(final Object request, final String headerName,
final Object headerObject,
final SendEaiMessageTemplateCallBack callback)
throws BaseRuntimeException {
log.debug( "doSend START >> {} ", request );
if ( this.requestObjectValidator != null
&& requestObjectValidator
.requiredValidation( requestObjectValidator ) ) {
requestObjectValidator.validateRequest( request );
}
final Exchange exchange = template.request( to, new Processor( ) {
public void process(final Exchange exchange) throws Exception {
exchange.getIn( ).setBody( request );
if ( headerName != null && headerObject != null ) {
exchange.getIn( ).setHeader( headerName, headerObject );
}
}
} );
log.debug( "doSend >> END >> exchange is failed? {}",
exchange.isFailed( ) );
Message outBoundMessage = null;
if ( callback != null ) {
// provide the callBack method to access exchange
callback.exchangeCallBack( exchange );
}
if ( exchange.isFailed( ) ) {
failedHandler.handleExchangeFailed( exchange, request );
} else {
outBoundMessage = exchange.getOut( false );
}
// handler outbound message
if ( this.outboundMessageHandler != null ) {
this.outboundMessageHandler.handleMessage( outBoundMessage );
}
if ( outBoundMessage != null ) {
if ( outBoundMessage.getBody( ) != null ) {
log.debug( "OutBoundMessage body {}", outBoundMessage.getBody( ) );
}
return (T) outBoundMessage.getBody( );
} else {
return null;
}
}
因此,我的应用程序遇到了内存不足异常。我不确定是不是因为 Apache Camel 库,请指教。
除此之外,当我打开heapdump
文件时,有 52% 的人抱怨com/ibm/xml/xlxp2/scan/util/SimpleDataBufferFactory$DataBufferLink
另一个是抱怨“这个 char[] 单独使用 Java 堆”,这也是下面的一些子类别DataBufferLink
。
我对此进行了谷歌搜索,所有内容都在谈论 xml 消息太大。
我不知道我应该继续以哪个方式或哪个方向进行故障排除,能否就此提出建议?
仅供参考,我正在使用 camel-core-1.5.0.jar