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

问题描述

我有以下代码

@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();
}

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

解决方法

JavaDoc for javax.jms.Message.clearProperties() 声明:

清除消息的属性。

邮件的标题字段和正文未清除。

如果您关心的 String 是使用 javax.jms.Message.getText() 检索的,那么这意味着 String 是消息的 正文 的一部分,{{1} } 甚至不碰。

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

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