Skip to content

Commit 21a33bc

Browse files
committed
Backport fix for #1995 in 2.10
1 parent ed82577 commit 21a33bc

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

release-notes/VERSION-2.x

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Project: jackson-databind
1010
#1675: Remove "impossible" `IOException` in `readTree()` and `readValue()` `ObjectMapper`
1111
methods which accept Strings
1212
(requested by matthew-pwnieexpress@github)
13+
#1995: Limit size of `DeserializerCache`, auto-flush on exceeding
1314
#2059: Remove `final` modifier for `TypeFactory`
1415
(requested by Thibaut R)
1516
#2115: Support naive deserialization of `Serializable` values as "untyped", same

src/main/java/com/fasterxml/jackson/databind/deser/DeserializerCache.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.fasterxml.jackson.databind.deser;
22

33
import java.util.HashMap;
4-
import java.util.concurrent.ConcurrentHashMap;
54

65
import com.fasterxml.jackson.annotation.JsonFormat;
76
import com.fasterxml.jackson.databind.*;
@@ -10,6 +9,7 @@
109
import com.fasterxml.jackson.databind.type.*;
1110
import com.fasterxml.jackson.databind.util.ClassUtil;
1211
import com.fasterxml.jackson.databind.util.Converter;
12+
import com.fasterxml.jackson.databind.util.LRUMap;
1313

1414
/**
1515
* Class that defines caching layer between callers (like
@@ -19,7 +19,7 @@
1919
* ({@link com.fasterxml.jackson.databind.deser.DeserializerFactory}).
2020
*/
2121
public final class DeserializerCache
22-
implements java.io.Serializable // since 2.1 -- needs to be careful tho
22+
implements java.io.Serializable // since 2.1
2323
{
2424
private static final long serialVersionUID = 1L;
2525

@@ -32,15 +32,9 @@ public final class DeserializerCache
3232
/**
3333
* We will also cache some dynamically constructed deserializers;
3434
* specifically, ones that are expensive to construct.
35-
* This currently means bean and Enum deserializers; starting with
36-
* 2.5, container deserializers will also be cached.
37-
*<p>
38-
* Given that we don't expect much concurrency for additions
39-
* (should very quickly converge to zero after startup), let's
40-
* define a relatively low concurrency setting.
35+
* This currently means bean, Enum and container deserializers.
4136
*/
42-
final protected ConcurrentHashMap<JavaType, JsonDeserializer<Object>> _cachedDeserializers
43-
= new ConcurrentHashMap<JavaType, JsonDeserializer<Object>>(64, 0.75f, 4);
37+
final protected LRUMap<JavaType, JsonDeserializer<Object>> _cachedDeserializers;
4438

4539
/**
4640
* During deserializer construction process we may need to keep track of partially
@@ -56,7 +50,14 @@ public final class DeserializerCache
5650
/**********************************************************
5751
*/
5852

59-
public DeserializerCache() { }
53+
public DeserializerCache() {
54+
this(2000); // see [databind#1995]
55+
}
56+
57+
public DeserializerCache(int maxSize) {
58+
int initial = Math.min(64, maxSize>>2);
59+
_cachedDeserializers = new LRUMap<>(initial, maxSize);
60+
}
6061

6162
/*
6263
/**********************************************************
@@ -67,7 +68,6 @@ public DeserializerCache() { }
6768
Object writeReplace() {
6869
// instead of making this transient, just clear it:
6970
_incompleteDeserializers.clear();
70-
// TODO: clear out "cheap" cached deserializers?
7171
return this;
7272
}
7373

0 commit comments

Comments
 (0)