[英]Parsing XML string in Java without OOM error
我在 Docker 中使用 Karaf 和 ActiveMQ Artemis,我的一條路線在消息隊列中獲得了一個 XML 字符串,我需要提取一個元素。 但我得到java.lang.OutOfMemoryError: Java heap space
我已將問題縮小到這些行之一。
public void process(Exchange exchange) throws Exception {
Object[] args = exchange.getIn().getBody(Object[].class);
JmsMessage message = (JmsMessage)args[0];
String s = message.getBody(String.class);
...
}
我想知道我的選擇是什么來解決這個錯誤。
查看容器內的free -m
output,
# free -m
total used free shared buff/cache available
Mem: 23948 11579 498 1316 11870 10690
Swap: 6143 240 5903
有 10GB 可用 RAM 外加 6GB 交換空間。 Artemis 隊列有<max-size-bytes>-1</max-size-bytes>
並且沒有設置<global-max-size>
。 所以沒有明確的限制。 根據broker.xml
文件中的評論,這可能導致最大-Xmx / 2
。 看起來默認是 -Xmx2G 所以這意味着最大 1GB。 請注意,該消息遠不及該大小。 它只是使用 Base64 作為二進制文件保存在 XML 中的 5MB 二進制文件。
因此,我將研究以更高的Xmx
啟動 AMQ,但除此之外,Java 中是否有任何選項可以處理解析String
(或JMSMessage
)而不溢出堆?
即喜歡流式傳輸或緩沖它,而不是將整個字符串加載到 memory 中?
該問題已通過在 /bin/setenv 下增加 Karaf 可用的 RAM 來解決
export JAVA_MAX_MEM=2048M
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.