问题描述
@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 实现。