小编Nic*_*ico的帖子

写入stderr时,共享C库(JNI)在jetty下挂起

我发现一个问题,在打印到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 …

java java-native-interface jetty jna jetty-9

5
推荐指数
1
解决办法
421
查看次数

标签 统计

java ×1

java-native-interface ×1

jetty ×1

jetty-9 ×1

jna ×1