Skip to content

On startup system stuck #331

@avostrovskyi1989

Description

@avostrovskyi1989

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions