You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-issues@jackrabbit.apache.org by "Paul Chibulcuteanu (Jira)" <ji...@apache.org> on 2022/09/30 16:32:00 UTC
[jira] [Created] (OAK-9963) Performance degradation when reading system properties on each NodeImpl
Paul Chibulcuteanu created OAK-9963:
---------------------------------------
Summary: Performance degradation when reading system properties on each NodeImpl
Key: OAK-9963
URL: https://issues.apache.org/jira/browse/OAK-9963
Project: Jackrabbit Oak
Issue Type: Bug
Components: jcr
Affects Versions: 1.22.11
Reporter: Paul Chibulcuteanu
Reading system properties on each NodeImpl causes performance issues especially on Java 8.
Code:
{code:java}
public NodeImpl(T dlg, SessionContext sessionContext) {
super(dlg, sessionContext);
logWarnStringSizeThreshold = Integer.getInteger(
OakJcrConstants.WARN_LOG_STRING_SIZE_THRESHOLD_KEY,
OakJcrConstants.DEFAULT_WARN_LOG_STRING_SIZE_THRESHOLD_VALUE);
}
{code}
One more important point on system property lookup in Oak. There is a huge difference between running the code on Java 8 and 11.
The following test looks up a system property with 32 concurrent threads. Each reading the system property 10M times.
{code:java}
@Test
public void run() throws Exception {
List<Thread> threads = new ArrayList<>();
for (int i = 0; i < 32; i++) {
threads.add(new Thread(this::getProperty));
}
Stopwatch sw = Stopwatch.createStarted();
threads.forEach(Thread::start);
for (Thread t : threads) {
t.join();
}
System.out.println("time: " + sw);
}
private void getProperty() {
for (int i = 0; i < 10_000_000; i++) {
System.getProperty("foo");
}
}
{code}
On my machine the outputs are:
Java 8: ~20 seconds
Java 11: 0.5 seconds
Reason is how Properties implementation changed with Java 11. It is now using a ConcurrentHashMap.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)