Skip to content

Commit 7e59e49

Browse files
committed
[#691] Improve memory usage via reuse InputStreamBufferInput
1 parent f1ac3dd commit 7e59e49

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed

msgpack-core/src/main/java/org/msgpack/core/buffer/InputStreamBufferInput.java

-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ public InputStreamBufferInput(InputStream in, int bufferSize)
6161
* @return the old resource
6262
*/
6363
public InputStream reset(InputStream in)
64-
throws IOException
6564
{
6665
InputStream old = this.in;
6766
this.in = in;

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackFactory.java

+15
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class MessagePackFactory
4040
private final MessagePack.PackerConfig packerConfig;
4141
private boolean reuseResourceInGenerator = true;
4242
private boolean reuseResourceInParser = true;
43+
private boolean reuseInputStreamBufferInput = true;
44+
4345
private ExtensionTypeCustomDeserializers extTypeCustomDesers;
4446

4547
public MessagePackFactory()
@@ -58,6 +60,7 @@ public MessagePackFactory(MessagePackFactory src)
5860
this.packerConfig = src.packerConfig.clone();
5961
this.reuseResourceInGenerator = src.reuseResourceInGenerator;
6062
this.reuseResourceInParser = src.reuseResourceInParser;
63+
this.reuseInputStreamBufferInput = src.reuseInputStreamBufferInput;
6164
if (src.extTypeCustomDesers != null) {
6265
this.extTypeCustomDesers = new ExtensionTypeCustomDeserializers(src.extTypeCustomDesers);
6366
}
@@ -75,6 +78,12 @@ public MessagePackFactory setReuseResourceInParser(boolean reuseResourceInParser
7578
return this;
7679
}
7780

81+
public MessagePackFactory setReuseInputStreamBufferInput(boolean reuseInputStreamBufferInput)
82+
{
83+
this.reuseInputStreamBufferInput = reuseInputStreamBufferInput;
84+
return this;
85+
}
86+
7887
public MessagePackFactory setExtTypeCustomDesers(ExtensionTypeCustomDeserializers extTypeCustomDesers)
7988
{
8089
this.extTypeCustomDesers = extTypeCustomDesers;
@@ -167,6 +176,12 @@ boolean isReuseResourceInParser()
167176
return reuseResourceInParser;
168177
}
169178

179+
@VisibleForTesting
180+
boolean isReuseInputStreamBufferInput()
181+
{
182+
return reuseInputStreamBufferInput;
183+
}
184+
170185
@VisibleForTesting
171186
ExtensionTypeCustomDeserializers getExtTypeCustomDesers()
172187
{

msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackParser.java

+34-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ public class MessagePackParser
4949
{
5050
private static final ThreadLocal<Tuple<Object, MessageUnpacker>> messageUnpackerHolder =
5151
new ThreadLocal<Tuple<Object, MessageUnpacker>>();
52+
53+
private static final ThreadLocal<InputStreamBufferInput> inputStreamBufferInputHolder =
54+
new ThreadLocal<>();
55+
5256
private final MessageUnpacker messageUnpacker;
5357

5458
private static final BigInteger LONG_MIN = BigInteger.valueOf((long) Long.MIN_VALUE);
@@ -130,7 +134,36 @@ public MessagePackParser(
130134
boolean reuseResourceInParser)
131135
throws IOException
132136
{
133-
this(ctxt, features, new InputStreamBufferInput(in), objectCodec, in, reuseResourceInParser);
137+
this(ctxt, features, objectCodec, in, reuseResourceInParser, true);
138+
}
139+
140+
public MessagePackParser(
141+
IOContext ctxt,
142+
int features,
143+
ObjectCodec objectCodec,
144+
InputStream in,
145+
boolean reuseResourceInParser,
146+
boolean reuseInputStreamBufferInput)
147+
throws IOException
148+
{
149+
this(ctxt, features, getInputStreamBufferInput(in, reuseInputStreamBufferInput), objectCodec, in, reuseResourceInParser);
150+
}
151+
152+
private static InputStreamBufferInput getInputStreamBufferInput(InputStream in, boolean reuseInputStreamBufferInput)
153+
{
154+
if (reuseInputStreamBufferInput) {
155+
final InputStreamBufferInput inputStreamBufferInput = inputStreamBufferInputHolder.get();
156+
if (inputStreamBufferInput != null) {
157+
inputStreamBufferInput.reset(in);
158+
return inputStreamBufferInput;
159+
}
160+
final InputStreamBufferInput newInputStreamBufferInput = new InputStreamBufferInput(in);
161+
inputStreamBufferInputHolder.set(newInputStreamBufferInput);
162+
return newInputStreamBufferInput;
163+
}
164+
else {
165+
return new InputStreamBufferInput(in);
166+
}
134167
}
135168

136169
public MessagePackParser(IOContext ctxt, int features, ObjectCodec objectCodec, byte[] bytes)

0 commit comments

Comments
 (0)