Maybe we don’t need to use the ThreadLocal object here,It causes oome errors.
Each time HttpBindBody is created, a ThreadLocal object will be created to store XMPPPacketReader. However, the XMPPPacketReader object is not deleted from ThreadLocal after use, that is, it is still stored in thread.
When threads are reused, the threadLocations table in the thread object becomes larger and larger.
Here is a sequence diagram and code snippet:
In HttpBindBody.java
private ThreadLocal<XMPPPacketReader> localReader = new ThreadLocal<>();
private XMPPPacketReader getPacketReader()
{
// Reader is associated with a new XMPPPacketReader
XMPPPacketReader reader = localReader.get();
if ( reader == null )
{
reader = new XMPPPacketReader();
reader.setXPPFactory( factory );
localReader.set( reader );
}
return reader;
}