A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/pmd/pmd/issues/5587 below:

[java] Thread deadlock during PMD analysis in ParseLock.getFinalStatus · Issue #5587 · pmd/pmd · GitHub

Affects PMD Version:
7.10.0 and 7.11.0

Make sure, to test with the latest PMD version.

Description:

We got reports of PMD analysis blocking the build pipelines. It seems to happen in one particular project using the sonar-pmd plugin which uses PMD 7.10.0. Running with PMD plugin in Intellij (PMD 7.7.0) and running from command line with 7.11.0 and pmd check -t 10 on same code base also results in deadlocks. The source code is a Java Spring Boot application.

Exception Stacktrace:

From jstack:
Found one Java-level deadlock:
=============================
"PmdThread 1":
  waiting to lock monitor 0x00006000032dc340 (object 0x00000004085d1cd8, a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1),
  which is held by "PmdThread 4"

"PmdThread 4":
  waiting to lock monitor 0x00006000032dc410 (object 0x0000000408510468, a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1),
  which is held by "PmdThread 1"

Java stack information for the threads listed above:
===================================================
"PmdThread 1":
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:41)
	- waiting to lock <0x00000004085d1cd8> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.rawType(TypeSystem.java:493)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.parameterise(TypeSystem.java:527)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser$TypeScanner.makeClassType(TypeSigParser.java:364)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.classType(TypeSigParser.java:164)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:148)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:124)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.arrayType(TypeSigParser.java:216)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:146)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.methodType(TypeSigParser.java:53)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.parseMethodType(SignatureParser.java:65)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse(GenericSigBase.java:265)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse(GenericSigBase.java:56)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:48)
	- locked <0x00000004085d1d00> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed(GenericSigBase.java:87)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.getParameterTypes(GenericSigBase.java:333)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getArity(ExecutableStub.java:83)
	at net.sourceforge.pmd.lang.java.symbols.JMethodSymbol.isAnnotationAttribute(JMethodSymbol.java:51)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1$$Lambda/0x00003ffc013641c8.test(Unknown Source)
	at java.util.stream.ReferencePipeline$2$1.accept(java.base@23.0.2/ReferencePipeline.java:196)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(java.base@23.0.2/ArrayList.java:1709)
	at java.util.stream.AbstractPipeline.copyInto(java.base@23.0.2/AbstractPipeline.java:570)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@23.0.2/AbstractPipeline.java:560)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@23.0.2/ReduceOps.java:921)
	at java.util.stream.AbstractPipeline.evaluate(java.base@23.0.2/AbstractPipeline.java:265)
	at java.util.stream.ReferencePipeline.collect(java.base@23.0.2/ReferencePipeline.java:727)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.finishParse(ClassStub.java:139)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:50)
	- locked <0x0000000408510468> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.fillSingleImports(SymTableFactory.java:299)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.singleImportsSymbolTable(SymTableFactory.java:270)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:232)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:138)
	at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.acceptVisitor(ASTCompilationUnit.java:109)
	at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.traverse(SymbolTableResolver.java:164)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver.traverse(SymbolTableResolver.java:101)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$1(JavaAstProcessor.java:132)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor$$Lambda/0x00003ffc01358000.run(Unknown Source)
	at net.sourceforge.pmd.benchmark.TimeTracker.bench(TimeTracker.java:163)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:132)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:166)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:150)
	at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:69)
	at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:25)
	at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse(JjtreeParserAdapter.java:36)
	at net.sourceforge.pmd.lang.impl.PmdRunnable.parse(PmdRunnable.java:112)
	at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:132)
	at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
	at java.util.concurrent.Executors$RunnableAdapter.call(java.base@23.0.2/Executors.java:572)
	at java.util.concurrent.FutureTask.run(java.base@23.0.2/FutureTask.java:317)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@23.0.2/ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@23.0.2/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith(java.base@23.0.2/Thread.java:1588)
	at java.lang.Thread.run(java.base@23.0.2/Thread.java:1575)
"PmdThread 4":
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:41)
	- waiting to lock <0x0000000408510468> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.getEnclosingTypeParameterOwner(ClassStub.java:418)
	at net.sourceforge.pmd.lang.java.symbols.JTypeParameterOwnerSymbol.getLexicalScope(JTypeParameterOwnerSymbol.java:40)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.getLexicalScope(ClassStub.java:333)
	at net.sourceforge.pmd.lang.java.symbols.JTypeParameterOwnerSymbol.getLexicalScope(JTypeParameterOwnerSymbol.java:41)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.getLexicalScope(ClassStub.java:333)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.getEnclosingTypeParams(GenericSigBase.java:83)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.typeParamsWrapper(SignatureParser.java:94)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.parseMethodType(SignatureParser.java:64)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse(GenericSigBase.java:265)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse(GenericSigBase.java:56)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:48)
	- locked <0x00000004085104b0> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed(GenericSigBase.java:87)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.getParameterTypes(GenericSigBase.java:333)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getArity(ExecutableStub.java:83)
	at net.sourceforge.pmd.lang.java.symbols.JMethodSymbol.isAnnotationAttribute(JMethodSymbol.java:51)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1$$Lambda/0x00003ffc013641c8.test(Unknown Source)
	at java.util.stream.ReferencePipeline$2$1.accept(java.base@23.0.2/ReferencePipeline.java:196)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(java.base@23.0.2/ArrayList.java:1709)
	at java.util.stream.AbstractPipeline.copyInto(java.base@23.0.2/AbstractPipeline.java:570)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@23.0.2/AbstractPipeline.java:560)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@23.0.2/ReduceOps.java:921)
	at java.util.stream.AbstractPipeline.evaluate(java.base@23.0.2/AbstractPipeline.java:265)
	at java.util.stream.ReferencePipeline.collect(java.base@23.0.2/ReferencePipeline.java:727)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.finishParse(ClassStub.java:139)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:50)
	- locked <0x00000004085d1cd8> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.rawType(TypeSystem.java:493)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.parameterise(TypeSystem.java:527)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser$TypeScanner.makeClassType(TypeSigParser.java:364)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.classType(TypeSigParser.java:164)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:148)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:124)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.arrayType(TypeSigParser.java:216)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.typeSignature(TypeSigParser.java:146)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.TypeSigParser.methodType(TypeSigParser.java:53)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.SignatureParser.parseMethodType(SignatureParser.java:65)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.doParse(GenericSigBase.java:265)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1.doParse(GenericSigBase.java:56)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:48)
	- locked <0x0000000408510490> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.ensureParsed(ParseLock.java:27)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase.ensureParsed(GenericSigBase.java:87)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.GenericSigBase$LazyMethodType.getParameterTypes(GenericSigBase.java:333)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ExecutableStub.getArity(ExecutableStub.java:83)
	at net.sourceforge.pmd.lang.java.symbols.JMethodSymbol.isAnnotationAttribute(JMethodSymbol.java:51)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1$$Lambda/0x00003ffc013641c8.test(Unknown Source)
	at java.util.stream.ReferencePipeline$2$1.accept(java.base@23.0.2/ReferencePipeline.java:196)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(java.base@23.0.2/ArrayList.java:1709)
	at java.util.stream.AbstractPipeline.copyInto(java.base@23.0.2/AbstractPipeline.java:570)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@23.0.2/AbstractPipeline.java:560)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@23.0.2/ReduceOps.java:921)
	at java.util.stream.AbstractPipeline.evaluate(java.base@23.0.2/AbstractPipeline.java:265)
	at java.util.stream.ReferencePipeline.collect(java.base@23.0.2/ReferencePipeline.java:727)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1.finishParse(ClassStub.java:139)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus(ParseLock.java:50)
	- locked <0x0000000408510a38> (a net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub$1)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.isFailed(ParseLock.java:82)
	at net.sourceforge.pmd.lang.java.symbols.internal.asm.ClassStub.isUnresolved(ClassStub.java:524)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.checkUserEnclosingTypeIsOk(ClassTypeImpl.java:452)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.validateParams(ClassTypeImpl.java:418)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:69)
	at net.sourceforge.pmd.lang.java.types.ClassTypeImpl.<init>(ClassTypeImpl.java:64)
	at net.sourceforge.pmd.lang.java.types.TypeSystem.typeOf(TypeSystem.java:466)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.fillSingleImports(SymTableFactory.java:299)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymTableFactory.singleImportsSymbolTable(SymTableFactory.java:270)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:232)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.visit(SymbolTableResolver.java:138)
	at net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.acceptVisitor(ASTCompilationUnit.java:109)
	at net.sourceforge.pmd.lang.java.ast.AbstractJavaNode.acceptVisitor(AbstractJavaNode.java:38)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver$MyVisitor.traverse(SymbolTableResolver.java:164)
	at net.sourceforge.pmd.lang.java.symbols.table.internal.SymbolTableResolver.traverse(SymbolTableResolver.java:101)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.lambda$process$1(JavaAstProcessor.java:132)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor$$Lambda/0x00003ffc01358000.run(Unknown Source)
	at net.sourceforge.pmd.benchmark.TimeTracker.bench(TimeTracker.java:163)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:132)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:166)
	at net.sourceforge.pmd.lang.java.internal.JavaAstProcessor.process(JavaAstProcessor.java:150)
	at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:69)
	at net.sourceforge.pmd.lang.java.ast.JavaParser.parseImpl(JavaParser.java:25)
	at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse(JjtreeParserAdapter.java:36)
	at net.sourceforge.pmd.lang.impl.PmdRunnable.parse(PmdRunnable.java:112)
	at net.sourceforge.pmd.lang.impl.PmdRunnable.processSource(PmdRunnable.java:132)
	at net.sourceforge.pmd.lang.impl.PmdRunnable.run(PmdRunnable.java:80)
	at java.util.concurrent.Executors$RunnableAdapter.call(java.base@23.0.2/Executors.java:572)
	at java.util.concurrent.FutureTask.run(java.base@23.0.2/FutureTask.java:317)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@23.0.2/ThreadPoolExecutor.java:1144)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@23.0.2/ThreadPoolExecutor.java:642)
	at java.lang.Thread.runWith(java.base@23.0.2/Thread.java:1588)
	at java.lang.Thread.run(java.base@23.0.2/Thread.java:1575)

Found 1 deadlock.

A heapdump analysis on the hanging threads shows at net.sourceforge.pmd.lang.java.symbols.internal.asm.ParseLock.getFinalStatus:

Thread 1: ClassStub:org/springframework/context/annotation/ComponentScan$Filter

Thread 4: ClassStub:org/springframework/context/annotation/ComponentScan

Further up the stack we see in net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit.acceptVisitor these two files are parsed: ApiApplication.java (thread 4) and `JpaConfiguration.java' (thread 1)

We notice @ComponentScan annotation used in ApiApplication.java and @EnableJpaRepositories annotation used in JpaConfiguration.java.

We notice that @EnableJpaRepositories uses the Filter inner interface from ComponentScan via

import org.springframework.context.annotation.ComponentScan.Filter;

When we remove @EnableJpaRepositories from JpaConfiguration.java and remove the java import of that org.springframework.data.jpa.repository.config.EnableJpaRepositories annotation, we cannot get deadlock situation.

Code Sample demonstrating the issue:

ApiApplication.java:

@SpringBootApplication
@ComponentScan({"io.example.auth", "io.example.api"})
public class ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }

}

JpaConfiguration.java:

@Configuration
@EnableJpaRepositories(repositoryFactoryBeanClass = SomeRepositoryFactoryBean.class, basePackages = "io.example.persistence")
public class JpaConfiguration {
...
}

If needed, we can try to create a small SpringBoot app that triggers the deadlock.

Steps to reproduce:

From cli (note it is running with 10 threads, if running with 1 no deadlock occurs):

/.../pmd-bin-7.11.0/bin/pmd check -t 10 -R /.../PMD-jPinpoint-rules/rulesets/java/jpinpoint-rules.xml -d src/main/java -f text --aux-classpath=target/classes:$(cat classpath.txt) -r java-issues-$(date +"%Y%m%d_%H%M").txt

Need to run multiple times to get deadlock, but happens quite often on machine described below.

To generate classpath.txt:

mvn dependency:build-classpath -Dmdep.outputFile=classpath.txt

Running PMD through: CLI (see above) | Maven (via sonar:sonar) | PMD Intellij Plugin

When running locally in command line on MacOS (Apple M1 Max - Sequoia 15.3.1):

java -version
openjdk version "23.0.2" 2025-01-21
OpenJDK Runtime Environment Zulu23.32+11-CA (build 23.0.2+7)
OpenJDK 64-Bit Server VM Zulu23.32+11-CA (build 23.0.2+7, mixed mode, sharing)

Same happens with Java 21.

Might be related to #5293.

Can deadlock be caused by use of inner interface/class? E.g. org/springframework/context/annotation/ComponentScan$Filter

Related / Similar issues in the past:


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4