-
Notifications
You must be signed in to change notification settings - Fork 159
Description
Hello
Library version: 6.1.0
Env: clipse-temurin:25-jre-jammy (Docker java 25)
Code: Executed in multi-threading env in separate executor service. So create expression mathExpression, than perform some prepared caluclation featureValue, and than add args to mathExpression and evaluate.
Expression mathExpression = new Expression(exp);
// calculating queries
Map<Query, FeatureValue> featureValue = calculator.calculate(
context,
usedQueries,
source
);
// adding arguments
int i = 0;
for (Query q : usedQueries) {
mathExpression.addArguments(
new Argument(
MathExpression.VARIABLE_PREFIX + ++i,
featureValue.get(q).getValue() == null ? Double.NaN : featureValue.get(q).getDouble()
)
);
}
double res = mathExpression.calculate();
Problem: Sometimes on application start/restart (during some active traffic) all threads in my executor service are in infinite RUNNING state and never backed. As the result all system stuck.
Here is one of thread trace from JMX
Name: Threadmainload783
State: RUNNABLE
Total blocked: 0 Total waited: 24
Stack trace:
app//org.mariuszgromada.math.mxparser.Argument.registerNoSyntaxErrorInDefinition(Argument.java:421)
app//org.mariuszgromada.math.mxparser.Argument.(Argument.java:558)
app//com.kraken.factory.MathFactory.doInBackground(MathFactory.java:177)
app//com.kraken.factory.MathFactory.lambda$future$0(MathFactory.java:103)
app//com.kraken.factory.MathFactory$$Lambda/0x00000000729a2f78.call(Unknown Source)
app//com.kraken.factory.AbstractBackgroundThreadFactory.lambda$background$0(AbstractBackgroundThreadFactory.java:38)
app//com.kraken.factory.AbstractBackgroundThreadFactory$$Lambda/0x00000000729a3940.run(Unknown Source)
app//com.concurrent.CountedRunnable.run(CountedRunnable.java:25)
app//com.context.CurrentContextHolder.lambda$wrap$0(CurrentContextHolder.java:85)
app//com.context.CurrentContextHolder$$Lambda/0x00000000729a3da8.run(Unknown Source)
java.base@25.0.2/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
java.base@25.0.2/java.util.concurrent.FutureTask.run(Unknown Source)
java.base@25.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.base@25.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.base@25.0.2/java.lang.Thread.runWith(Unknown Source)
java.base@25.0.2/java.lang.Thread.run(Unknown Source)
Temporary solution: I think i've found tmp solution when added on app startup.
private static void forceStaticInitialization() {
// This triggers ALL mXparser static initializers:
// - StringModel. ← the problematic one
// - mXparser.
// - Argument.
// - Expression.
// All run NOW in single thread = no concurrent class loading
Argument warmupArg = new Argument("warmup_x", 1.0);
Expression warmupExpr = new Expression("warmup_x + 1", warmupArg);
double result = warmupExpr.calculate();
// Force StringModel specifically
var desc = StringModel.getStringResources();
}
So, can you please investigate this problem om your side or give me some explanation or advise? Thank you.
BR, Andrii