`
agapple
  • 浏览: 1584298 次
  • 性别: 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相关的全部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....

    jetty在eclipse中配置

    自己写的jetty6在eclipse启动中配置说明

    eclipse jetty插件run-jetty-run-1.3.3

    eclipse jetty插件,从...下载run-jetty-run.zip文件,解压后再编写个links文件丢到eclipse的dropins目录下即可,省去了使用eclipse update方式安装的麻烦。 link文件样例如: path=d:\\eclipse_plugins\\run-jetty-run

    Jetty多版本软件包

    Jetty软件包内容: jetty-distribution-9.4.51.v20230217.tar.gz jetty-distribution-9.4.51.v20230217.zip jetty-home-10.0.15.tar.gz jetty-home-10.0.15.zip jetty-home-11.0.15.tar.gz jetty-home-11.0.15.zip ...

    jetty6 指南书

    jetty是什么 jetty配置 jetty使用 jetty嵌入 jetty启动 jetty部署 jetty教程 jetty嵌入式 jetty

    run-jetty-run 1.3.5eclipse插件包

    在eclipse 4.5.2中安装jetty插件,然后提取plugins和features目录中的相关文件,打包做成可用link方式安装,省去更换eclipse版本时需要重新下载的问题。 安装方法为新加一个run-jetty-run.link文件,文件内容为 path...

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

    jetty修改js不用重启项目的方法,你还在愁每次修改js后,都需要重启jetty吗?看完此文档,再也不用愁了,里面有图有真相,动手操作,让你受益匪浅

    jetty 适合jdk1.8用的服务器

    jetty 是一款轻量级的web服务器,相比Tomcat版本更复杂,每个jdk的版本使用的jetty都可能不一样,9.4的版本适合jdk1.8使用

    jetty嵌入式服务器必须的jar包

    jetty嵌入式服务器开发所必须的jar包,本人使用jetty版本为6.1.3,jar包总数为9个,来自jetty:commons-el-1.0.jar,...(以上包可以使用相同的包替代,不一定必须来自jetty或者tomcat)其中JettyServer.java为示例代码

    PDF的JETTY文档

    .jetty

    Jetty cometd(Continuation)学习笔记

    Jetty 7是Jetty奔向Eclipse后发布的第一个版本,本次的Jetty 7 RC2带给了我们一个十分诱人的新特性-支持跨域名Ajax请求。众所周知因为安全的原因,多数浏览器都限制了Ajax跨域请求和javascript加载的时候只能是与...

    Jetty嵌入项目代码中示例

    把${jetty_home}/lib/jsp-2.1目录复制到${project_home}/jetty/lib目录下(如果不复制jsp-2.1或jsp-2.0也可以正常启动,只是不能解析jsp,打开主页时提示 JSP not support)。 同样把jetty-6.1.14.jar、jetty-util-...

    jetty相关所有jar包

    jetty相关所有jar包,包含jar包: jetty-continuation-8.1.15.v20140411,jetty-http-8.1.15.v20140411,jetty-io-8.1.15.v20140411,jetty-security-8.1.15.v20140411,jetty-server-8.1.15.v20140411,jetty-util-8.1.15...

    jetty 学习资料合集

    jetty 学习资料合集 jetty 学习资料合集 jetty 学习资料合集 jetty 学习资料合集

    Jetty配置支持https

    Jetty配置支持HTTPS以及受信网站证书生成方式

    maven集成jetty所需jar包maven-jetty-plugin,多版本

    maven集成jetty必须jar包maven-jetty-plugin,内含多个版本

    i-jetty libs包

    android i-jetty servlet-api-2.5.jar jetty-servlet-7.6.0.RC4.jar jetty-server-7.6.0.RC4.jar jetty-http-7.6.0.RC4.jar

    jetty源代码下载

    jetty源代码下载 jetty源代码下载 jetty源代码下载 jetty源代码下载

    jetty-6.1.26-API文档-中英对照版.zip

    包含翻译后的API文档:jetty-6.1.26-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.mortbay.jetty:jetty:6.1.26; 标签:mortbay、jetty、jar包、java、API文档、中英对照版; 使用方法:解压翻译后...

Global site tag (gtag.js) - Google Analytics