`
agapple
  • 浏览: 1595629 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jetty实施后jps不可用问题

    博客分类:
  • java
阅读更多

背景

   自从公司应用大部分迁移到了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失效

  1. 目前公司同事测试来看,jdk16_23/24开始,jvm启动时产生进程号的临时文件目录不是使用$TMP(%TMP%)/hsperfdata,而是使用-Djava.io.tmpdir指定的目录。
  2. 凑巧使用了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>
        **/
  3. 最后jps根本不可能知道要去哪里找这个目录,除非在一个固定的目录中查找这 个文件的指示,那还如直接在那个固定的目录直接写pid,之前的$TMP(%TMP%)/hsperfdata_${username},相对jvm来说,它就是一个固定的目录。而现在却可以根据参数改变,但JPS无法知道这个参数,所以无法获取PID。

对应的jdk bug描述: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7021676 

解决

  1. 就是先用jdk 1.6.0-18,等jdk bug修复。
  2. 根据jetty的war的解压算法,避免使用-Djava.io.tmpdir, ((jetty.home)/work和WEB-INF/work目前来看都不满足需求)
  3. 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

 

 

分享到:
评论
1 楼 agapple 2011-05-04  
貌似使用1.6.0_25已经解决了jps的问题了,哈哈。又可以升级了

相关推荐

    jetty实施手册

    ### Jetty实施手册关键知识点详解 ...通过上述对“jetty实施手册”的深入解析,我们可以看到,无论是技术选型、配置优化还是实施策略,手册都提供了详尽的指导,旨在帮助读者构建高性能、高可用的Web应用系统。

    jetty 适合jdk1.8用的服务器

    解压下载的Jetty发行版后,通过命令行运行相应的启动脚本,就可以启动Jetty服务器。为了部署Web应用程序,可以将WAR文件放置在`webapps`目录下,Jetty会自动检测并部署它们。 总的来说,Jetty 9.4.22.v20191022是...

    jetty在eclipse中配置

    你可以选择"Use Tomcat installation"(让Eclipse管理Jetty安装)或"Use workspace metadata"(不修改Jetty安装)。对于开发而言,后者更方便。 6. **运行和调试Web应用** 右键点击服务器,选择"Start"或"Debug",...

    Jetty整合RestEasy开发RESTful web service的例程

    - 创建一个名为`jetty-distribution`的目录,将解压后的Jetty文件移动到这个目录下。 - 在Jetty的`webapps`目录下,我们可以放置我们的Web应用。 2. **创建RESTful服务** - 创建一个新的Java项目,并添加...

    eclipse jetty插件_3.8版本(可用).rar

    由于官方下载速度较慢,这个可用的3.8版本插件提供了方便快捷的下载途径,对于需要快速开始Jetty 9开发的用户来说是一个很好的选择。为了安装这个插件,用户只需将压缩包中的"eclipse jetty9.0"文件解压至Eclipse的...

    jetty修改js不用重启项目的方法

    在开发过程中,频繁地修改JavaScript文件并希望即时看到效果是常见的需求,而每次修改后都需要重启Jetty服务无疑会降低开发效率。本文将详细介绍如何在Jetty环境中配置,使得修改js文件时无需重启项目即可生效。 1....

    jetty各个版本下载

    此外,Jetty还支持热部署,这意味着你可以在不重启服务器的情况下更新Web应用。 6. **Jetty与其他服务器的比较** 相比Apache Tomcat或其他服务器,Jetty在轻量级特性、内存使用效率和响应速度上有优势。特别是对于...

    jetty相关的全部jar包

    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....

    Jetty9 配置使用HTTPS证书

    完成以上配置后,重启Jetty服务器,以使配置生效。在重启过程中可能还需要注意服务器日志的输出,以便及时发现并解决可能出现的配置错误或问题。 综上所述,配置Jetty服务器使用HTTPS证书是一个涉及证书申请、格式...

    jetty.jar,jetty-sslengine.jar,jetty-util.jar

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛用于开发、测试和部署Web应用程序。在Java生态系统中,Jetty以其高效、稳定和灵活性而受到开发者们的青睐。这里我们主要讨论三个核心的Jetty组件...

    jetty 6 指南书

    Jetty 6 指南书是一本详细讲解 Jetty 6.x 版本的专著,由陈汝烨撰写,旨在填补网络上关于 Jetty 新颖、系统性资料的空白,推动 Jetty 在国内的普及。这本书不仅介绍了 Jetty 作为 Web 容器的基本功能,还深入探讨了...

    idea的jetty-runner1.2.1插件

    总的来说,Jetty Runner 1.2.1 是 IntelliJ IDEA 中一个非常实用的插件,它简化了本地开发过程,使开发者能够更专注于编写代码和解决问题。如果你经常使用 IntelliJ IDEA 开发 Java Web 应用,这个插件绝对值得尝试...

    jetty 学习资料合集

    8. **故障排查**:学习如何分析Jetty的日志,定位并解决问题,以及如何使用Jetty提供的监控工具进行问题诊断。 9. **安全与认证**:理解Jetty的安全模型,包括基本认证、摘要认证、客户端证书认证等,以及如何配置...

    eclipse_jetty9离线插件

    6. **安装插件**:在列出的可用软件中,勾选Jetty 9插件,按照提示完成安装过程。 7. **验证安装**:重启Eclipse后,可以在"窗口" &gt; "首选项" &gt; "Jetty"中看到配置选项,表明插件已成功安装。 通过这个离线插件,...

    jetty-all.jar

    Jetty-all.jar是一个集合了众多Jetty组件的综合性JAR文件,它的主要目的是为了方便开发者在项目中快速引入和使用Jetty服务器。Jetty是一个开源的HTTP服务器和Servlet容器,它以其轻量级、高性能和易用性而受到广泛...

    jetty9.4.11+jetty在idea上的配置教程

    首先,我们需要解决Jetty资源下载慢的问题,然后详细介绍在IDEA中配置Jetty的步骤。 **解决Jetty资源下载慢的问题:** 由于Jetty的官方下载站点可能对国内用户访问速度较慢,我们可以选择从国内的镜像站点或者第三...

    jetty-6.1.26.zip

    Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,与Tomcat相似,它为开发和部署Web应用程序提供了一种高效的选择。Jetty在设计上注重灵活性和可扩展性,使得它在处理HTTP协议、WebSocket协议以及部署各种...

    jetty 8及依赖包

    这个压缩包包含Jetty 8版本的实现及其依赖库,是学习和理解Jetty工作原理,尤其是NIO(非阻塞I/O)和Servlet容器实现的宝贵资源。 Jetty 8在设计时特别强调了性能和可扩展性,它使用了Java NIO(New I/O)API来处理...

    jetty 9.4.9

    解压后,用户可以找到启动脚本、配置文件以及示例应用程序,帮助快速开始使用Jetty。 在Jetty 9.4.9中,开发者可以享受到以下优势: - **快速启动和低内存占用**:Jetty以其快速启动和低内存占用而闻名,这对于...

Global site tag (gtag.js) - Google Analytics