我发现一个问题,在打印到stderr时,在jetty下使用JNA调用的共享库会被卡住.
我已经通过首先创建一个非常简单的C共享库来简化问题,使其易于重现,只需调用fprintf(stderr,"0123456789\n");100次,然后返回.
在java端,我们在全局锁上有一个synchronize语句,以确保一次只有一个线程在共享库中.
synchronized (lock) {
Foo.INSTANCE.shared_lib_function();
}
Run Code Online (Sandbox Code Playgroud)
我在jetty下部署它并最终向jetty发出请求以最终调用共享库(在少于100个请求之后),我发现共享库被卡住了.
使用jstack我们可以看到在共享库调用中卡住的线程(类已被重命名):
Thread 5991: (state = BLOCKED)
- com.whats.going.on.connector.MyFooCaller.callIt() @bci=55, line=105 (Interpreted frame)
- com.whats.going.on.Controller.callSharedLib() @bci=101, line=71 (Interpreted frame)
- com.whats.going.on.Controller$$FastClassBySpringCGLIB$$d6a0f4b3.invoke(int, java.lang.Object, java.lang.Object[]) @bci=72 (Interpreted frame)
- org.springframework.cglib.proxy.MethodProxy.invoke(java.lang.Object, java.lang.Object[]) @bci=19, line=204 (Interpreted frame)
- org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint() @bci=19, line=717 (Interpreted frame)
- org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() @bci=19, line=157 (Interpreted frame)
- org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(org.aopalliance.intercept.MethodInvocation) @bci=7, line=64 (Interpreted frame)
- org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() @bci=101, line=179 (Interpreted frame)
- org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], org.springframework.cglib.proxy.MethodProxy) @bci=112, line=653 (Interpreted frame)
Run Code Online (Sandbox Code Playgroud)
使用gdb …