背景
自从公司应用大部分迁移到了jetty后,一些杂七杂吧的问题,陆续的冒上来。 前段时间有很多人问我使用了jetty之后,对应的jps功能无法正常使用,jinfo/jstack等等这些命令都正常。
原因分析
java进程启动后,会在$TMP(%TMP%)/hsperfdata_$username 创建一个perfData数据,用于jvmstat一些统计数据(可以看一下神人的神帖:http://rednaxelafx.iteye.com/blog/796343)。
可以做个尝试, 启动一个main函数:
public class InstrumentServer {
private String ip;
private String port;
public InstrumentServer(String ip, String port){
this.ip = ip;
this.port = port;
}
public int start(String ip, String port) {
System.out.println("start at : " + ip + ":" + port);
return 123;
}
public void stop() {
this.ip = null;
this.port = null;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public static void main(String args[]) throws Exception {
for (int i = 0; i < 1000; i++) {
InstrumentServer server = new InstrumentServer(String.valueOf(i), String.valueOf(i));
server.start(String.valueOf(i), String.valueOf(i));
Thread.sleep(1000);
server.stop();
}
}
}
jvm参数:
-XX:-UsePerfData
几个现象:
1. 这时/tmp/hsperfdata_$username 下发现没有对应的java进程的文件
2. jps发现没有对应该main函数的进程信息
3. jinfo,jstack,jmap均可以使用,jstat功能不能使用(gc信息获取)
关于该jvm参数的,可以查看http://stackoverflow.com/questions/76327/how-can-i-prevent-java-from-creating-hsperfdata-files
最后回过头,看一下最初的问题,为啥jps失效
-
目前公司同事测试来看,jdk16_23/24开始,jvm启动时产生进程号的临时文件目录不是使用$TMP(%TMP%)/hsperfdata,而是使用-Djava.io.tmpdir指定的目录。
- 凑巧使用了jetty后,为了解决每次jetty都可以清除war包解压后的临时文件,所以强制指定了-Djava.io.tmpdir=${jetty_server}/tmp/ , 模拟了jboss_server的方式,所有的jetty运行的信息都会保存到一个${jetty_server}目录下,每次重启都会清空该目录。避免上一次的结果对下一次启动的影响,以前遇到过部署内容一直被缓存的问题,所以采取了这样的一种暴力删除的方式。
war解压临时目录算法如下:
/**
* Get a temporary directory in which to unpack the war etc etc.
* The algorithm for determining this is to check these alternatives
* in the order shown:
*
* <p>A. Try to use an explicit directory specifically for this webapp:</p>
* <ol>
* <li>
* Iff an explicit directory is set for this webapp, use it. Do NOT set
* delete on exit.
* </li>
* <li>
* Iff javax.servlet.context.tempdir context attribute is set for
* this webapp && exists && writeable, then use it. Do NOT set delete on exit.
* </li>
* </ol>
*
* <p>B. Create a directory based on global settings. The new directory
* will be called "Jetty_"+host+"_"+port+"__"+context+"_"+virtualhost
* Work out where to create this directory:
* <ol>
* <li>
* Iff $(jetty.home)/work exists create the directory there. Do NOT
* set delete on exit. Do NOT delete contents if dir already exists.
* </li>
* <li>
* Iff WEB-INF/work exists create the directory there. Do NOT set
* delete on exit. Do NOT delete contents if dir already exists.
* </li>
* <li>
* Else create dir in $(java.io.tmpdir). Set delete on exit. Delete
* contents if dir already exists.
* </li>
* </ol>
**/
-
最后jps根本不可能知道要去哪里找这个目录,除非在一个固定的目录中查找这 个文件的指示,那还如直接在那个固定的目录直接写pid,之前的$TMP(%TMP%)/hsperfdata_${username},相对jvm来说,它就是一个固定的目录。而现在却可以根据参数改变,但JPS无法知道这个参数,所以无法获取PID。
对应的jdk bug描述: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7021676
解决
- 就是先用jdk 1.6.0-18,等jdk bug修复。
- 根据jetty的war的解压算法,避免使用-Djava.io.tmpdir, ((jetty.home)/work和WEB-INF/work目前来看都不满足需求)
- hack jetty的war解压算法,添加自定义的参数变量进行控制,(需要考虑后期的jetty升级成本,不是很可取)
最后,只能暂时使用jdk 1.6.0-18,等jdk bug的修复。
其他
众所周知,linux下/tmp/目录下的文件会被进行定时删除,那是不是/tmp/hsperfdata_${username},也存在同样的风险? 过一段时间后,对应的jps和jstat功能都会出现不可用。
redhat下有tmpwatch任务进行控制,在/etc/cron.daily/tmpwatch有对应的脚本,可以设置排查下对应的/tmp/hsperfdata_*的目录的清理工作,让jvm自己来保证,保证jps,jstat命令的可用
具体可以看一下, http://sdh5724.iteye.com/blog/600803
分享到:
相关推荐
### Jetty实施手册关键知识点详解 ...通过上述对“jetty实施手册”的深入解析,我们可以看到,无论是技术选型、配置优化还是实施策略,手册都提供了详尽的指导,旨在帮助读者构建高性能、高可用的Web应用系统。
解压下载的Jetty发行版后,通过命令行运行相应的启动脚本,就可以启动Jetty服务器。为了部署Web应用程序,可以将WAR文件放置在`webapps`目录下,Jetty会自动检测并部署它们。 总的来说,Jetty 9.4.22.v20191022是...
你可以选择"Use Tomcat installation"(让Eclipse管理Jetty安装)或"Use workspace metadata"(不修改Jetty安装)。对于开发而言,后者更方便。 6. **运行和调试Web应用** 右键点击服务器,选择"Start"或"Debug",...
- 创建一个名为`jetty-distribution`的目录,将解压后的Jetty文件移动到这个目录下。 - 在Jetty的`webapps`目录下,我们可以放置我们的Web应用。 2. **创建RESTful服务** - 创建一个新的Java项目,并添加...
由于官方下载速度较慢,这个可用的3.8版本插件提供了方便快捷的下载途径,对于需要快速开始Jetty 9开发的用户来说是一个很好的选择。为了安装这个插件,用户只需将压缩包中的"eclipse jetty9.0"文件解压至Eclipse的...
在开发过程中,频繁地修改JavaScript文件并希望即时看到效果是常见的需求,而每次修改后都需要重启Jetty服务无疑会降低开发效率。本文将详细介绍如何在Jetty环境中配置,使得修改js文件时无需重启项目即可生效。 1....
此外,Jetty还支持热部署,这意味着你可以在不重启服务器的情况下更新Web应用。 6. **Jetty与其他服务器的比较** 相比Apache Tomcat或其他服务器,Jetty在轻量级特性、内存使用效率和响应速度上有优势。特别是对于...
jetty-security-9.4.8.v20171121.jar,jetty-io-9.4.8.v20171121.jar,jetty-continuation-9.4.8.v20171121.jar,jetty-client-9.4.8.v20171121.jar,jetty-jmx-9.4.8.v20171121.jar,jetty-plus-9.4.8.v20171121....
完成以上配置后,重启Jetty服务器,以使配置生效。在重启过程中可能还需要注意服务器日志的输出,以便及时发现并解决可能出现的配置错误或问题。 综上所述,配置Jetty服务器使用HTTPS证书是一个涉及证书申请、格式...
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛用于开发、测试和部署Web应用程序。在Java生态系统中,Jetty以其高效、稳定和灵活性而受到开发者们的青睐。这里我们主要讨论三个核心的Jetty组件...
Jetty 6 指南书是一本详细讲解 Jetty 6.x 版本的专著,由陈汝烨撰写,旨在填补网络上关于 Jetty 新颖、系统性资料的空白,推动 Jetty 在国内的普及。这本书不仅介绍了 Jetty 作为 Web 容器的基本功能,还深入探讨了...
总的来说,Jetty Runner 1.2.1 是 IntelliJ IDEA 中一个非常实用的插件,它简化了本地开发过程,使开发者能够更专注于编写代码和解决问题。如果你经常使用 IntelliJ IDEA 开发 Java Web 应用,这个插件绝对值得尝试...
8. **故障排查**:学习如何分析Jetty的日志,定位并解决问题,以及如何使用Jetty提供的监控工具进行问题诊断。 9. **安全与认证**:理解Jetty的安全模型,包括基本认证、摘要认证、客户端证书认证等,以及如何配置...
6. **安装插件**:在列出的可用软件中,勾选Jetty 9插件,按照提示完成安装过程。 7. **验证安装**:重启Eclipse后,可以在"窗口" > "首选项" > "Jetty"中看到配置选项,表明插件已成功安装。 通过这个离线插件,...
Jetty-all.jar是一个集合了众多Jetty组件的综合性JAR文件,它的主要目的是为了方便开发者在项目中快速引入和使用Jetty服务器。Jetty是一个开源的HTTP服务器和Servlet容器,它以其轻量级、高性能和易用性而受到广泛...
首先,我们需要解决Jetty资源下载慢的问题,然后详细介绍在IDEA中配置Jetty的步骤。 **解决Jetty资源下载慢的问题:** 由于Jetty的官方下载站点可能对国内用户访问速度较慢,我们可以选择从国内的镜像站点或者第三...
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,与Tomcat相似,它为开发和部署Web应用程序提供了一种高效的选择。Jetty在设计上注重灵活性和可扩展性,使得它在处理HTTP协议、WebSocket协议以及部署各种...
这个压缩包包含Jetty 8版本的实现及其依赖库,是学习和理解Jetty工作原理,尤其是NIO(非阻塞I/O)和Servlet容器实现的宝贵资源。 Jetty 8在设计时特别强调了性能和可扩展性,它使用了Java NIO(New I/O)API来处理...
解压后,用户可以找到启动脚本、配置文件以及示例应用程序,帮助快速开始使用Jetty。 在Jetty 9.4.9中,开发者可以享受到以下优势: - **快速启动和低内存占用**:Jetty以其快速启动和低内存占用而闻名,这对于...