使用 TextMessage 接口 (JMS) 的 .clearProperties() 是否会从堆 space 中删除属性?

Does using .clearProperties() of TextMessage interface (JMS) remove the properties from the heap space?

我有以下代码:

@JmsListener(...)
Public void messageListener(TextMessage message){
   System.out.println(message.getText());
   //Writing string to a file...and then
   //clear it from heap space
   message.clearProperties();
   //Once removed from heap read from file and process string
   processString();
}

这是否从堆 space 中删除了 String。实际上,我从 MQ 中获取的消息可能有 20MB,所以我想将它写入一个文件,然后从我的堆中清除它 space。这行得通吗?请告诉我如何更好地表述问题。

JavaDoc for javax.jms.Message.clearProperties() 状态:

Clears a message's properties.

The message's header fields and body are not cleared.

如果您关心的 String 是使用 javax.jms.Message.getText() 检索到的,那么这意味着 String 是消息的 body 的一部分clearProperties() 甚至没有碰到。

无论如何,唯一释放堆 space 的是垃圾收集器,您无法直接控制它。您能做的最好的事情就是确保您感兴趣的 Object 没有参考文献。但是,在这种情况下,您正在使用 API(即 JMS),其实现尚不清楚,因此即使设置 message = null 之类的操作也可能不足以让 GC 收集它,因为底层实现可能仍然有参考。

使用 javax.jms.Message.clearBody() 似乎更适合您的用例,但即便如此,JMS API 也不能保证底层消息数据可以免费用于垃圾收集。确切的行为将完全取决于您使用的 JMS 实现。