- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
尝试调试行为异常的 Java 虚拟机。有问题的进程是一个大型 VM(100GB 堆),在 Centos 5 上运行 Sun VM 1.6u24,它正在执行常规后端工作——即数据库访问、文件 I/O 等等。
在软件版本升级重启进程后,我们注意到其吞吐量明显下降。大多数时候,top 报告 Java 进程充分利用了 2 个内核。在那段时间里,VM 完全不负责:不写入日志,也不响应 jstack 或 kill -3 等外部工具。一旦 VM 恢复,该过程将照常继续,直到下一次挂起。
strace 显示在这些挂起期间,只有 2 个线程进行系统调用。它们是 VM 线程“VM Thread”(21776) 和“VM Periodic Task Thread”(21786)。据推测,这 2 个线程正在用完 CPU 时间。应用程序线程偶尔会醒来并完成它们的工作。其余时间他们似乎在等待各种 futexes。顺便说一句,正常阶段的第一行始终是 SIGSEGV。
[pid 21776] sched_yield() = 0
[pid 21776] sched_yield() = 0
[pid 21776] sched_yield( <unfinished ...>
[pid 21786] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 21776] <... sched_yield resumed> ) = 0
[pid 21786] futex(0x2aabac71ef28, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 21776] sched_yield( <unfinished ...>
[pid 21786] <... futex resumed> ) = 0
[pid 21786] clock_gettime(CLOCK_MONOTONIC, {517080, 280918033}) = 0
[pid 21786] clock_gettime(CLOCK_REALTIME, {1369750039, 794028000}) = 0
[pid 21786] futex(0x2aabb81b94c4, FUTEX_WAIT_PRIVATE, 1, {0, 49923000} <unfinished ...>
[pid 21776] <... sched_yield resumed> ) = 0
[pid 21776] sched_yield() = 0
[pid 21776] sched_yield() = 0
[pid 21955] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 21955] rt_sigreturn(0x2b1cde2f54ad <unfinished ...>
问题出现在 2 个不同的服务器上。回滚我们的代码版本仅适用于 2 个服务器之一。系统日志中没有报告任何错误消息,受影响机器上的另一个 Java 进程运行正常。
以下输出是使用 gstack 获得的,并显示了 2 个典型的等待应用程序线程:
Thread 552 (Thread 0x4935f940 (LWP 21906)):
#0 0x00000030b040ae00 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00002b1cdd8548d6 in os::PlatformEvent::park(long) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#2 0x00002b1cdd92b230 in ObjectMonitor::wait(long, bool, Thread*) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#3 0x00002b1cdd928853 in ObjectSynchronizer::wait(Handle, long, Thread*) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#4 0x00002b1cdd69b716 in JVM_MonitorWait () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#5 0x00002b1cde193cc8 in ?? ()
#6 0x00002b1ce2552d90 in ?? ()
#7 0x00002b1cdd84fc23 in os::javaTimeMillis() () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#8 0x00002b1cde188a82 in ?? ()
#9 0x0000000000000000 in ?? ()
Thread 551 (Thread 0x49460940 (LWP 21907)):
#0 0x00000030b040ab99 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1 0x00002b1cdd854d6f in Parker::park(bool, long) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#2 0x00002b1cdd98a1c8 in Unsafe_Park () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#3 0x00002b1cde193cc8 in ?? ()
#4 0x000000004945f798 in ?? ()
#5 0x00002b1cde188a82 in ?? ()
#6 0x0000000000000000 in ?? ()
我们查看了 NTPD 的问题,包括闰秒错误,但建议的解决方法没有帮助,使用外部 NTPD 服务器也没有帮助。重新启动机器本身也无济于事。我们启用了 GC 日志记录,它看起来不是 GC 问题,因为没有消息表明它。寻找可以帮助解决此问题的任何建议,非常感谢任何帮助。
最佳答案
以下是我要查看的一些内容:
当 JVM 没有响应时,使用 iostat
和 vmstat
查看系统是否在抖动。当您过度分配内存时可能会发生这种情况;即,您的整个系统使用的虚拟内存明显多于物理内存。
打开 JVM 的 GC 日志记录,查看 JVM 无响应与 GC 运行之间是否存在关联。
关于java - JVM 周期性挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796221/
我已经完成了创建和启动计时器的手册页。 http://man7.org/linux/man-pages/man2/timerfd_create.2.html 但是,除了 arm(start) 和 di
我正在用 opengl 编写新的代码库,很早就遇到了一个奇怪的错误。这是帧速率的明显波动,具有重复性和可预测性。 我知道它肯定与渲染的对象成正比。它也与屏幕大小成正比(不是视口(viewport)大小
我知道如何使用计算数组中点之间的欧几里得距离 scipy.spatial.distance.cdist 类似于这个问题的答案: Calculate Distances Between One Poin
我想使用 CGAL 构造周期性 3D Delaunay 三角剖分和信息(在本例中为整数)。对于 2D,如果我构造一个 vector 对(点,信息)并将其传递给三角测量函数,则效果很好。然而,非常类似的
每隔几天,我们就会收到少量 MySql 超时错误,这些错误与我们的 MySQL RDS 实例上的 CPU 和数据库连接出现大量峰值相对应。这些查询通常非常快(<5 毫秒),但突然超时。 此时,数据库操
我是一名优秀的程序员,十分优秀!