Skip to content

Commit 1f50b0d

Browse files
authored
Merge pull request #38 from SentryMan/recycle
Use JVM 19 Buffer Recycling
2 parents 0b91050 + cffa032 commit 1f50b0d

File tree

2 files changed

+42
-26
lines changed

2 files changed

+42
-26
lines changed

jsonb/src/main/java/io/avaje/jsonb/stream/JsonStream.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,8 @@ public JsonReader reader(Reader reader) {
112112

113113
@Override
114114
public JsonReader reader(InputStream inputStream) {
115-
try {
116-
JsonParser parser = Recycle.parser(inputStream);
117-
return new JsonReadAdapter(parser, failOnUnknown);
118-
} catch (IOException e) {
119-
throw new UncheckedIOException(e);
120-
}
115+
JsonParser parser = Recycle.parser(inputStream);
116+
return new JsonReadAdapter(parser, failOnUnknown);
121117
}
122118

123119
@Override
Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,58 @@
11
package io.avaje.jsonb.stream;
22

3-
import java.io.IOException;
43
import java.io.InputStream;
54
import java.io.OutputStream;
65

76
final class Recycle {
7+
private Recycle() {}
8+
9+
private static boolean jvmRecycle;
10+
private static ThreadLocal<JParser> read;
11+
private static ThreadLocal<JGenerator> managed;
12+
13+
static {
14+
if (Float.parseFloat(System.getProperty("java.specification.version")) >= 19
15+
&& !Boolean.getBoolean("jsonb.UseTLBuffers")) {
16+
jvmRecycle = true;
17+
} else {
18+
managed = ThreadLocal.withInitial(Recycle::getGenerator);
19+
read = ThreadLocal.withInitial(Recycle::getParser);
20+
}
21+
}
822

9-
static ThreadLocal<JGenerator> managed = ThreadLocal.withInitial(() -> new JGenerator(4096));
10-
11-
static ThreadLocal<JParser> read = ThreadLocal.withInitial(() -> {
12-
char[] ch = new char[4096];
13-
byte[] by = new byte[4096];
14-
return new JParser(ch, by, 0, JParser.ErrorInfo.MINIMAL, JParser.DoublePrecision.DEFAULT, JParser.UnknownNumberParsing.BIGDECIMAL, 100, 50_000);
15-
});
16-
17-
/**
18-
* Return a recycled generator with the given target OutputStream.
19-
*/
23+
/** Return a recycled generator with the given target OutputStream. */
2024
static JsonGenerator generator(OutputStream target) {
21-
return managed.get().prepare(target);
25+
return (jvmRecycle ? getGenerator() : managed.get()).prepare(target);
2226
}
2327

24-
/**
25-
* Return a recycled generator with expected "to String" result.
26-
*/
28+
/** Return a recycled generator with expected "to String" result. */
2729
static JsonGenerator generator() {
28-
return managed.get().prepare(null);
30+
return (jvmRecycle ? getGenerator() : managed.get()).prepare(null);
2931
}
3032

3133
static JsonParser parser(byte[] bytes) {
32-
return read.get().process(bytes, bytes.length);
34+
return (jvmRecycle ? getParser() : read.get()).process(bytes, bytes.length);
35+
}
36+
37+
static JsonParser parser(InputStream in) {
38+
return (jvmRecycle ? getParser() : read.get()).process(in);
39+
}
40+
41+
static JGenerator getGenerator() {
42+
return new JGenerator(4096);
3343
}
3444

35-
static JsonParser parser(InputStream in) throws IOException {
36-
return read.get().process(in);
45+
static JParser getParser() {
46+
final char[] ch = new char[4096];
47+
final byte[] by = new byte[4096];
48+
return new JParser(
49+
ch,
50+
by,
51+
0,
52+
JParser.ErrorInfo.MINIMAL,
53+
JParser.DoublePrecision.DEFAULT,
54+
JParser.UnknownNumberParsing.BIGDECIMAL,
55+
100,
56+
50_000);
3757
}
3858
}

0 commit comments

Comments
 (0)