两个问题:
首先,对于管理运行 Java 应用程序的服务器的系统管理员,您需要哪些“Java 技能”?例如:进行堆栈跟踪、进行堆转储、监视 JVM 等。
其次,这些系统管理员认为哪些工具有用。(例如,一个用于跟踪所有正在运行的 jvm 的堆栈的应用程序可能会有帮助)。
[编辑:至少在 Windows 上,有时很难找出哪个 java.exe 是哪个。因此,“所有 jvms”的堆栈跟踪将简化系统管理员的任务,而不是追捕它们。]
我们的系统管理员有 Windows 背景。我们希望缩小开发人员和管理员之间的差距,这样系统管理员就可以在 Java 应用程序挂起/占用资源/等情况下充当第一道防线。
什么对你有用?
答案1
我认为 JVM 管理员至少需要知道:
- 能够安装任何给定的(子)版本的运行时,使用推荐的参数启动 JVM,
- 调整运行时参数和指令以进行必要的应用程序日志记录(即启用 GC 日志记录)
- 了解单个操作系统实例上多个运行时的文件系统级安全性。
- 工作负载管理(CP 亲和性、JVM 人体工程学)
- 虚拟网络接口,
- 根据系统利用率规范化进程利用率。
- 启用/禁用分析
- jstat/jmap &c
其他人已经提到知道如何生成堆转储。
答案2
一些有用的工具:
获取线程转储(在 Linux 系统上 kill -HUP ... 不确定 Windows 上的等效机制是什么)将为您提供快照应用程序的状态 - 类似于海森堡的不确定性原理(不是真的:-))它会告诉你系统的状态现在但不会告诉您它将要做什么或之前刚刚做了什么。
线程转储很好,因为它们只将输出打印到应用程序的 STDERR(或适当的日志)并且根本不会导致它锁定。
进行堆转储对于了解应用程序内数据的状态非常有用 - 您可以使用 jmap(部分 JDK/JRE 发行版)等工具进行堆转储。但关键问题是,为了进行堆转储,需要在执行此操作时暂停 JVM。这会导致应用程序对最终用户锁定。因此,除非情况真的很糟糕,否则您可能不想这样做。
第三,你可以使用Java 管理扩展能够监控应用程序的 CPU、内存、线程和类状态的内部运行状态。这还可以允许 Java 应用程序的开发人员公开应用程序的内部统计信息,这些统计信息也可以进行监控 - 例如使用 Nagios 的 check_jmx 实用程序。
最后,您显然拥有标准系统工具,可以用来监控 CPU、磁盘 I/O、内存利用率等,这些都可以让您深入了解系统的整体运行状况以及它是否处于“良好”状态。
答案3
我认为其他答案涵盖了大部分基础知识,但就具体技能和工具而言,这些答案脱颖而出,成为起点。
可视化虚拟机
为了立即检查正在运行的线程并从所有可用的线程中选择 Java 进程,java.net VisualVM 工具非常棒。
有一个直观的树状视图,可以查看正在运行的 Java 线程和进程的本地和远程(如果您在应用上启用了远程调试);
您可以使用它来保存正在运行的进程的快照,然后可以在闲暇时进行分析;
并且您可以检查您的线程状态,或进行概要分析并查看您的应用程序将所有时间都花在了哪些方法上;
此外,还有一堆插件用于特定的集成,并且有一个 eclipse 插件。
查看更多精彩内容的屏幕截图 -http://visualvm.java.net/
理解类加载器
我认为我早期没有花精力去理解 JVM 的工作原理,特别是类加载器和容器生命周期,这给自己带来了很多痛苦。如果你知道 JVM 使用的策略,那么泛型和参数化类的许多奇怪之处就会更有意义。