Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM在尝试获取信号量时陷入困境_Java_Windows_Jvm_Jetty_Semaphore - Fatal编程技术网

Java JVM在尝试获取信号量时陷入困境

Java JVM在尝试获取信号量时陷入困境,java,windows,jvm,jetty,semaphore,Java,Windows,Jvm,Jetty,Semaphore,我有一个使用嵌入式Jetty(版本9.3.6.v20151106)和JDK 8u65的应用程序 当我在Mac或Linux上使用这个应用程序时,我没有任何困难。但是,在Windows上,Jetty不会启动,应用程序永久挂起 我在进程上运行了一个jstack命令,并隔离了阻止服务器启动的线程 java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wai

我有一个使用嵌入式Jetty(版本9.3.6.v20151106)和JDK 8u65的应用程序

当我在Mac或Linux上使用这个应用程序时,我没有任何困难。但是,在Windows上,Jetty不会启动,应用程序永久挂起

我在进程上运行了一个jstack命令,并隔离了阻止服务器启动的线程

java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x1a3b2018> (a java.util.concurrent.Semaphore$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
    at java.util.concurrent.Semaphore.acquire(Semaphore.java:312)
    at org.eclipse.jetty.annotations.AnnotationConfiguration.scanForAnnotations(AnnotationConfiguration.java:540)
    at org.eclipse.jetty.annotations.AnnotationConfiguration.configure(AnnotationConfiguration.java:447)
    at org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:491)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1336)
java.lang.Thread.State:等待(停车)
在sun.misc.Unsafe.park(本机方法)
-停车等待(java.util.concurrent.Semaphore$NonfairSync)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer.DoAcquireSharedTerruptibly(AbstractQueuedSynchronizer.java:997)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
位于java.util.concurrent.Semaphore.acquire(Semaphore.java:312)
位于org.eclipse.jetty.annotations.AnnotationConfiguration.scanForAnnotations(AnnotationConfiguration.java:540)
位于org.eclipse.jetty.annotations.AnnotationConfiguration.configure(AnnotationConfiguration.java:447)
位于org.eclipse.jetty.webapp.WebAppContext.configure(WebAppContext.java:491)
位于org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1336)
我寻找另一根支撑锁的线,但没有


如何进一步调试此问题?这是JVM错误还是Windows安全特性?非常感谢您的帮助。

windows似乎没有正确报告处理器数量。
尝试将org.eclipse.jetty.annotations.multi-threaded属性设置为false,看看是否有帮助。

结果是我对自己的日志一无所知。我发现我在扫描应用程序的jar时抛出oom。 有许多因素可以解释为什么这种情况会在Windows上发生。首先,这是一个32位发行版,所以在内存方面有点反复无常。Java的最大堆大小最终会受到这种方式的影响

正如在#jetty IRC频道上所讨论的那样(感谢joakime的帮助),这是由于应用程序的WEB-INF/lib的jar扫描。这会延长启动时间,如果你有一个装满垃圾文件的大罐子,可能会导致OOM

joakime指出了解决这一问题的两种可能性:

  • 预打包并准备应用程序,然后继续使用
  • 通过使用regexp选择要扫描的jar(本文底部),故意扫描jar
我最终使用了后者。我使用这个regexp来匹配jstl jar和spring jar(我使用spring security的taglibs jar):

我寻找另一根支撑锁的线,但没有

信号量比锁更通用。这是一堆许可证,根本不一定与任何事情有关。它们可以由一个或多个线程获取和释放,并且不需要在完成获取的线程上进行释放

一个线程甚至可以创建一个信号量,使用所有可用的许可证,然后等待它自己的信号量,而另一个线程从未接触过它

因此,通过寻找“持有锁”的其他线程来调试信号量是不容易的


要调试它们,您必须跟踪获取和发布,并查看许可证在哪里耗尽,然后找出应该在哪里发布,而不是在哪里发布。

我尝试了您的建议,但似乎没有奏效。我将继续尝试(使用java-jar从命令行)。当我试图缩小范围时,我会用更多的信息来更新这个问题。我试图用一个Java程序来重现这个问题,但它的行为方式不同。我还可以看到Windows返回的内核数量是正确的。有了spring,不要忘记您可以捕获所有日志框架,并使用slf4j将它们路由到单个日志层。
".*/jstl-[^/]*\\.jar$|.*/spring-[^/]*\\.jar$"