文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java启动参数如何排查

2023-07-02 00:20

关注

这篇文章主要讲解了“java启动参数如何排查”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java启动参数如何排查”吧!

排查过程

我们的应用是java应用,jdk版本是Open-jdk8,阿里云agent是直接注入到容器中的,因此会将agent启动参数自动注入到 JAVA_TOOL_OPTIONS 环境变量中,当应用启动时会自动带上agent启动参数。

agent没注册,首先检查应用的启动日志,发现应用是启动成功的,tomcat端口都是正常的。仔细观察日志,发现了问题。由于agent 启动参数是注入到 JAVA_TOOL_OPTIONS 中的,通常jvm 在启动的时候会优先加载 JAVA_TOOL_OPTIONS,日志中会出现 Picked up JAVA_TOOL_OPTIONS 的字样,如下图所示,但是问题现场却没有这一行和agent相关的启动日志,说明 jvm 启动的时候并没有加载 JAVA_TOOL_OPTIONS。

java启动参数如何排查

我们开始怀疑是 agent启动参数 的问题,以为是agent在容器重建时没有将启动参数注入到环境变量中。但是通过环境变量一看,发现 JAVA_TOOL_OPTIONS 是在的,而且每个agent的参数都是齐全的。

java启动参数如何排查

这个时候就开始怀疑是不是启动脚本的问题,是不是有人在启动脚本中加了unset JAVA_TOOL_OPTIONS,因为当存在JAVA_TOOL_OPTIONS时,使用jdk相关的命令都会带上JAVA_TOOL_OPTIONS中的参数,造成一定的困扰,所以有时候在排查问题的时候会先unset掉这个变量,但是检查完脚本也没有问题。

最后开始咨询阿里云的工程师,怀疑是不是agent或者容器环境有问题。经过反复比较正常容器和问题容器的JAVA_TOOL_OPTIONS启动参数,发现问题容器因为多加载一个agent,JAVA_TOOL_OPTIONS多出来一段参数,去掉这段参数就能恢复正常,加上就会有问题。到这里,可能正常的思路都是怀疑是多出来的参数造成的。但在排查其他正常容器时发现,有的容器即使有这一段参数也能正常启动。

这个时候,阿里云的工程师怀疑是不是参数太长导致的,因为有问题的容器的应用名字比较长,于是我们开始测试,发现确实是这个问题,如下图所示。随后确定了问题所在,jdk8 在加载默认环境变量时会检查长度,当大于1024字节时就会加载失败

java启动参数如何排查

环境变量

在jdk相关的环境变量中,有两种默认的环境变量 JAVA_TOOL_OPTIONS_JAVA_OPTIONS

JAVA_TOOL_OPTIONS:在jdk8及之前版本中,该变量是最标准的,所有虚拟机都能识别和应用的环境变量,在jdk9之后被JDK_JAVA_OPTIONS所取代。该变量限制1024字节,在不同虚拟机中表现不一样,有的是加载失败,有的是截取一段。

_JAVA_OPTIONS:也是默认的环境变量,但是它是JVM厂家自定义的,可以覆盖JAVA_TOOL_OPTIONS,但各厂家的命名不同,_JAVA_OPTIONS是Oracle的JVM,而IBM的则是用IBM_JAVA_OPTIONS。

因此为避免出现问题,我们应该尽量避免使用默认的环境变量,通常情况下可以在脚本中自定义启动变量如 JAVA_OPTSSPRINGBOOT_OPTS等等。然后在启动java时显式的指定启动参数。

java [-options] -jar xxx.jar [args…]可以写成JAVA_OPTS="[-options]"JAVA_ARGS="[args…]"java ${JAVA_OPTS} -jar xxx.jar ${JAVA_ARGS}

附:启停脚本

项目打包后在测试环境的启停都是个体力活,刚好又给笔者遇到了,综合别人的脚本记录了一下

判断 Java 进程是否存在

APP_NAME=xxx.jarpid=jps -l | grep $APP_NAMEif [ -z $pid ]; then echo "$APP_NAME started" else echo "$APP_NAME stoped" fi # 普通进程的# pid=ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'

启停脚本

APP_NAME=xxxx-1.0-SNAPSHOT.jarpid=0checkpid() {    javaps=`jps -l | grep $APP_NAME`    if [ -n "$javaps" ]; then    pid=`echo $javaps | awk '{print $1}'`    else    pid=0}start() {    checkpid    if [ $psid -ne 0 ]; then    echo "$APP_NAME already started"    else    echo "Starting $APP_NAME ..."    `nohup java -jar $APP_NAME > $APP_NAME'.out' 2>&1 &`    checkpid    if [ $pid -ne 0]; then    echo "$APP_NAME start success"    else    echo "$APP_NAME start faild"    fi    fi}stop() {    checkpid    if [ $pid -ne 0 ]; then    echo "Stoping $APP_NAME..."        kill -9 $pid        if [$? -eq 0 ]; then        echo "$APP_NAME stop success"        else        echo "$APP_NAME stop faild"       fi    else    echo "$APP_NAME already stoped"   fi}case "$1" in 'start') start ;; 'stop') stop ;; 'restart') stop start ;; *)# 其他任何情况 echo "help: $0 {start|stop|restart}"echo "例子: ./deploy startexit 1esacexit 0

感谢各位的阅读,以上就是“java启动参数如何排查”的内容了,经过本文的学习后,相信大家对java启动参数如何排查这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯