我必须创建堆转储,它与 jmap 配合得很好。我的问题是,jmap 创建 heapdump 文件需要很长时间。特别是当堆越来越大(> 1GB)时,它花费的时间太长。
一种情况为例:
当服务器遇到堆空间问题时,我想自动重新启动它并在重新启动之前创建一个堆转储。这有效,但编写堆转储需要很长时间。这样服务器停机时间太长了。heapdump 创建需要一个多小时。
我知道-XX:+HeapDumpOnOutOfMemoryError,但大多数时候我可以在 jvm 抛出异常之前找到内存问题。
是否有替代 jmap 的方法可以更快地写入堆转储?
对于上述示例的特殊解决方案也将不胜感激。
这个问题是编程和系统管理之间的混合,但我认为我来对地方了。
我们有一个 Java 应用程序,它在 Solaris 10 服务器中比在 Windows PC 中慢得多。
我们已经分析 (-Xprof) 应用程序,并观察到 UnixFileSystem.getBooleanAttributes0 方法使用本机调用消耗大约 40% 的 CPU 时间。
我们如何按照我们的搜索来确定行为缓慢的原因是什么?
更新:
我们已经执行dtrace并观察到 CPU 时间为 0.489 秒,而time结果是
real 0m40.759s
user 0m47.669s
sys 0m2.287s
Run Code Online (Sandbox Code Playgroud)
似乎时间不是花在 CPU 上,而是花在了另一个地方。有了这个dtrace结果,我们如何进行进一步的调查?我们可以使用其他dtrace选项来显示更多信息吗?
非常感谢。
# /dtrace-toolkit/DTraceToolkit-0.99/procsystime -aTp 5695
Tracing... Hit Ctrl-C to end...
dtrace: 1032 dynamic variable drops with non-empty dirty list
^C
Elapsed Times for PID 5695,
SYSCALL TIME (ns)
gtime 7799
sysconfig 8018
lwp_kill 10105
getsockname 10215
systeminfo 10984 …Run Code Online (Sandbox Code Playgroud) 我有多台运行 CentOS 5.4 的服务器,只有一个应用程序在 Java VM 上运行。我已经使用以下参数配置了 Java VM:
java -Xmx4500M -server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:NewSize=1024m -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote=true
Run Code Online (Sandbox Code Playgroud)
我运行 VM 的机器有 6 GB RAM,没有其他应用程序在运行。过了一会儿,java 进程开始非常努力地访问交换空间,我从top命令中得到了这个信息:
7658 root 25 0 11.7g 3.9g 4796 S 39.4 67.3 543:54.17 java
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我通过 JConsole 连接,它会报告 Java VM 已使用 2.6 GB,已提交 4.6 GB,最大 4.6 GB。
java -version 返回:
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)
为什么 Java 虚拟机比分配的堆大小扩展得如此之多?如果 JConsole 中未报告该内存,那么该内存会去哪里?
我们正在尝试在 Ubuntu 9.04 上编写 sun jdk 安装脚本并让它自动接受许可协议。我在网上看到了一些关于创建包查找的文件的内容,但没有一个是完整的。有谁知道如何让这个工作?
当我尝试在 amazon ec2 上的 ubuntu(10.10) 服务器上安装包时,使用 JRE 的 update-alternatives”,apt-get 不再响应。
我已经等了 20 分钟,用这行文字来解决这个问题:
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
Run Code Online (Sandbox Code Playgroud)
如果我尝试停止它并重新启动系统。下次我以任何方式使用 apt-get 或 aptitude 时
E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.
Run Code Online (Sandbox Code Playgroud)
其中该命令没有解决问题,使我的 apt-get 损坏。
我正在 Windows 2008 平台上运行 Apache Tomcat (5.5) 的一个实例。我想我看到了一个与并发文件访问/锁定相关的问题。
当并发 HTTP 线程的数量增加到超过默认设置 (150) 时,我看到(使用站点监控工具)在提供某些静态内容(.js .gif .png 等)时“不自然”延迟的数量越来越多。我的意思是,服务器在开始发送之前需要 20 秒以上,或者需要 30 秒来提供小 (2KiB) 文件。
当 Tomcat 繁忙(服务超过 300 个线程)时,CPU 使用率平均约为 50-60%,磁盘使用率约为 10-30mbps。
是否有任何工具可以用于 Java 来确定是否是这种情况?Tomcat APR / Apache Native Library 是否有可能解决这个问题?
或者,还有什么我应该研究的吗?
网站分析工具截图:

我们遇到了内存不足的 Java 应用程序问题。我们的 (Windows XP) 客户端 PC 安装了 JRE 1.6 版本 18。我想将 JRE 的 -Xmx 运行时参数增加到 512M,但我似乎无法为所有用户设置它。当我以管理员身份登录 PC 并在 Java 控制台中设置运行时参数时,这些设置仅在我登录时出现。
我刚刚完成了从 Windows Server 2008 R2 到 Ubuntu 10.04 的迁移。我管理一个有一些性能问题的 Java 应用程序(Java 6、Tomcat)。我想使用 JMX 来尝试排除故障,但我似乎无法连接 jvisualvm。
如果我执行 ps -ef | grep "java",我看到以下参数。
-Dcom.sun.management.jmxremote.port=8084
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
Run Code Online (Sandbox Code Playgroud)
Netstat 显示端口 8084 正在侦听 0.0.0.0。在我的配置中,JMX 设置为绑定到服务器的 FQDN(我们使用私有 DNS 服务器)。我的防火墙 (IPTABLES/UFW) 设置为允许所有传出流量,并允许端口 8084 上的传入流量。
服务器本身是虚拟的,有两个 NIC,一个公共的和一个私有的。公共 NIC 的网关被禁用,因此连接只能在专用端进入。
当我尝试使用 JMX 将 jvisualvm 连接到我的应用服务器时,我在 jvisualvm 中收到以下错误。
Cannot connect to [FQDN OMITTED]:8084 using server:jmx:rmi:///jndi/rmi://[FQDN OMITTED]:8084/jmxrmi
Run Code Online (Sandbox Code Playgroud)
如果我查看 jvisualvm 日志,我会看到以下跟踪。
NFO [com.sun.tools.visualvm.jmx.impl.JmxModelImpl]: connect(service:jmx:rmi:///jndi/rmi://[FQDN OMITTED]:8084/jmxrmi)
java.io.EOFException: SSL peer shut down incorrectly
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789)
Caused: javax.net.ssl.SSLHandshakeException: Remote host closed connection during …Run Code Online (Sandbox Code Playgroud) 我希望为基于 Java 服务器的应用程序设置监控和警报,并希望找到一些最佳实践来监控 JVM 特定指标以及基于这些指标设计警报。
那么需要监控的关键 JVM 指标是什么?一些可能的竞争者:
一旦你开始观察一些指标,对于这些指标,什么是好的警报策略?CPU 使用情况似乎很简单,但是像堆空间这样的东西似乎很适合监视和查看,但它并没有像您期望的那样很好地转化为可警报的指标,因为它会增长到容量,触发 GC。但是像在 GC 中花费的时间,特别是与总时间的比率,它似乎具有很好的警报潜力。
我不是在寻找一种工具本身(即 Hyperic 或 Nagios)来执行监控,但如果有一个具有特别好的 Java 模板/默认图形/规则集的工具,那将是一个方便的指针。
假设我有一个在 Tomcat 上运行并使用 MySQL 数据库的 Spring Framework App:

在这种情况下,考虑到社交性(价格/性能/集成时间)的最佳解决方案是什么?
更准确地说:Web 负载均衡器盒子上会有什么,谁应该成为集群的 tomcat Web 服务器?数据库负载平衡器框上会显示什么以及数据库服务器应该如何集群?如果可能的话,特定的技术集成链接将大有帮助。
java ×10
tomcat ×3
linux ×2
apt ×1
centos ×1
console ×1
dump ×1
filesystems ×1
heapspace ×1
jmx ×1
memory ×1
monitoring ×1
mysql ×1
performance ×1
solaris ×1
ubuntu ×1
ubuntu-9.04 ×1