This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git
The following commit(s) were added to refs/heads/main by this push:
new 9ff555694 feat(java): add config params for IdentityObjectIntMap
(#3048)
9ff555694 is described below
commit 9ff5556948391b403155df170036b955f3fe5b85
Author: tom <[email protected]>
AuthorDate: Sat Dec 13 21:31:42 2025 +0800
feat(java): add config params for IdentityObjectIntMap (#3048)
Add config params: size and loadFactor of MapRefResolver's
writtenObjects for huge and complex object(#3047); Let user init map
size in some situtations.
## Related issues
[3047](https://github.com/apache/fory/issues/3047)
## Does this PR introduce any user-facing change?
- [ ] Does this PR introduce any public API change?
- [ ] Does this PR introduce any binary protocol compatibility change?
## Benchmark
---
java/fory-core/src/main/java/org/apache/fory/Fory.java | 2 +-
java/fory-core/src/main/java/org/apache/fory/config/Config.java | 9 +++++++++
.../src/main/java/org/apache/fory/config/ForyBuilder.java | 9 +++++++++
.../src/main/java/org/apache/fory/resolver/MapRefResolver.java | 7 ++++---
.../test/java/org/apache/fory/resolver/MapRefResolverTest.java | 4 ++--
5 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/java/fory-core/src/main/java/org/apache/fory/Fory.java
b/java/fory-core/src/main/java/org/apache/fory/Fory.java
index ab56612e6..186d1c342 100644
--- a/java/fory-core/src/main/java/org/apache/fory/Fory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/Fory.java
@@ -147,7 +147,7 @@ public final class Fory implements BaseFory {
longEncoding = config.longEncoding();
maxDepth = config.maxDepth();
if (refTracking) {
- this.refResolver = new MapRefResolver();
+ this.refResolver = new MapRefResolver(config.mapRefLoadFactor());
} else {
this.refResolver = new NoRefResolver();
}
diff --git a/java/fory-core/src/main/java/org/apache/fory/config/Config.java
b/java/fory-core/src/main/java/org/apache/fory/config/Config.java
index 46888240b..0488cbfb5 100644
--- a/java/fory-core/src/main/java/org/apache/fory/config/Config.java
+++ b/java/fory-core/src/main/java/org/apache/fory/config/Config.java
@@ -66,6 +66,7 @@ public class Config implements Serializable {
private final boolean serializeEnumByName;
private final int bufferSizeLimitBytes;
private final int maxDepth;
+ private final float mapRefLoadFactor;
boolean foryDebugOutputEnabled =
"1".equals(System.getenv("ENABLE_FORY_DEBUG_OUTPUT"))
|| "true".equals(System.getenv("ENABLE_FORY_DEBUG_OUTPUT"));
@@ -110,6 +111,7 @@ public class Config implements Serializable {
serializeEnumByName = builder.serializeEnumByName;
bufferSizeLimitBytes = builder.bufferSizeLimitBytes;
maxDepth = builder.maxDepth;
+ mapRefLoadFactor = builder.mapRefLoadFactor;
}
/** Returns the name for Fory serialization. */
@@ -312,6 +314,7 @@ public class Config implements Serializable {
Config config = (Config) o;
return name == config.name
&& trackingRef == config.trackingRef
+ && mapRefLoadFactor == config.mapRefLoadFactor
&& basicTypesRefIgnored == config.basicTypesRefIgnored
&& stringRefIgnored == config.stringRefIgnored
&& timeRefIgnored == config.timeRefIgnored
@@ -346,6 +349,7 @@ public class Config implements Serializable {
return Objects.hash(
name,
language,
+ mapRefLoadFactor,
trackingRef,
basicTypesRefIgnored,
stringRefIgnored,
@@ -391,4 +395,9 @@ public class Config implements Serializable {
public int maxDepth() {
return maxDepth;
}
+
+ /** Returns loadFactor of MacRef's writtenObjects. */
+ public float mapRefLoadFactor() {
+ return mapRefLoadFactor;
+ }
}
diff --git
a/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java
b/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java
index 0c610bad5..9d4cce82c 100644
--- a/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java
+++ b/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java
@@ -89,6 +89,7 @@ public final class ForyBuilder {
int bufferSizeLimitBytes = 128 * 1024;
MetaCompressor metaCompressor = new DeflaterMetaCompressor();
int maxDepth = 50;
+ float mapRefLoadFactor = 0.51f;
public ForyBuilder() {}
@@ -389,6 +390,14 @@ public final class ForyBuilder {
return this;
}
+ /** Set loadFactor of MapRefResolver writtenObjects. Default value is 0.51 */
+ public ForyBuilder withMapRefLoadFactor(float loadFactor) {
+ Preconditions.checkArgument(
+ loadFactor > 0 && loadFactor < 1, "loadFactor must > 0 and < 1 but got
%s", loadFactor);
+ this.mapRefLoadFactor = loadFactor;
+ return this;
+ }
+
/** Whether enable scala-specific serialization optimization. */
public ForyBuilder withScalaOptimizationEnabled(boolean
enableScalaOptimization) {
this.scalaOptimizationEnabled = enableScalaOptimization;
diff --git
a/java/fory-core/src/main/java/org/apache/fory/resolver/MapRefResolver.java
b/java/fory-core/src/main/java/org/apache/fory/resolver/MapRefResolver.java
index 1ed9bfe48..850570c6e 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/MapRefResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/MapRefResolver.java
@@ -52,15 +52,16 @@ public final class MapRefResolver implements RefResolver {
private long writeTotalObjectSize = 0;
private long readCounter;
private long readTotalObjectSize = 0;
- private final IdentityObjectIntMap<Object> writtenObjects =
- new IdentityObjectIntMap<>(DEFAULT_MAP_CAPACITY, 0.51f);
+ private final IdentityObjectIntMap<Object> writtenObjects;
private final ObjectArray readObjects = new
ObjectArray(DEFAULT_ARRAY_CAPACITY);
private final IntArray readRefIds = new IntArray(DEFAULT_ARRAY_CAPACITY);
// last read object which is not a reference
private Object readObject;
- public MapRefResolver() {}
+ public MapRefResolver(float loadFactor) {
+ writtenObjects = new IdentityObjectIntMap<>(DEFAULT_MAP_CAPACITY,
loadFactor);
+ }
@Override
public boolean writeRefOrNull(MemoryBuffer buffer, Object obj) {
diff --git
a/java/fory-core/src/test/java/org/apache/fory/resolver/MapRefResolverTest.java
b/java/fory-core/src/test/java/org/apache/fory/resolver/MapRefResolverTest.java
index c0db308c1..62bc934ae 100644
---
a/java/fory-core/src/test/java/org/apache/fory/resolver/MapRefResolverTest.java
+++
b/java/fory-core/src/test/java/org/apache/fory/resolver/MapRefResolverTest.java
@@ -31,7 +31,7 @@ public class MapRefResolverTest {
@Test
public void testTrackingReference() {
- MapRefResolver referenceResolver = new MapRefResolver();
+ MapRefResolver referenceResolver = new MapRefResolver(0.51f);
MemoryBuffer buffer = MemoryBuffer.newHeapBuffer(32);
assertTrue(referenceResolver.writeRefOrNull(buffer, null));
assertFalse(referenceResolver.writeRefOrNull(buffer, new Object()));
@@ -48,7 +48,7 @@ public class MapRefResolverTest {
// If java jit run and optimized `writeRefOrNull`, set
`ENABLE_FORY_REF_PROFILING`
// by reflection may not take effect too.
// System.setProperty("fory.enable_ref_profiling", "true");
- MapRefResolver referenceResolver = new MapRefResolver();
+ MapRefResolver referenceResolver = new MapRefResolver(0.51f);
MemoryBuffer buffer = MemoryBuffer.newHeapBuffer(32);
Object obj1 = new Object();
referenceResolver.writeRefOrNull(buffer, obj1);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]