簡體   English   中英

解析Java中的XML字符串無OOM錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM