最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java啟動參數(shù)之謎的排查過程

 更新時間:2022年06月07日 15:40:06   作者:邪笑風  
在日常操作中,相信很多人對Java啟動參數(shù)存在疑惑,下面這篇文章主要給大家介紹了關于java啟動參數(shù)之謎的排查過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

背景

最近遇到一個有意思的事情,java應用運行在阿里云的ack集群中,某一天有個應用啟動突然發(fā)現(xiàn)阿里云上的agent都沒有注冊了,于是開始排查原因。

排查過程

我們的應用是java應用,jdk版本是Open-jdk8,阿里云agent是直接注入到容器中的,因此會將agent啟動參數(shù)自動注入到 JAVA_TOOL_OPTIONS 環(huán)境變量中,當應用啟動時會自動帶上agent啟動參數(shù)。

agent沒注冊,首先檢查應用的啟動日志,發(fā)現(xiàn)應用是啟動成功的,tomcat端口都是正常的。仔細觀察日志,發(fā)現(xiàn)了問題。由于agent 啟動參數(shù)是注入到 JAVA_TOOL_OPTIONS 中的,通常jvm 在啟動的時候會優(yōu)先加載 JAVA_TOOL_OPTIONS,日志中會出現(xiàn) Picked up JAVA_TOOL_OPTIONS 的字樣,如下圖所示,但是問題現(xiàn)場卻沒有這一行和agent相關的啟動日志,說明 jvm 啟動的時候并沒有加載 JAVA_TOOL_OPTIONS。

我們開始懷疑是 agent啟動參數(shù) 的問題,以為是agent在容器重建時沒有將啟動參數(shù)注入到環(huán)境變量中。但是通過環(huán)境變量一看,發(fā)現(xiàn) JAVA_TOOL_OPTIONS 是在的,而且每個agent的參數(shù)都是齊全的。

這個時候就開始懷疑是不是啟動腳本的問題,是不是有人在啟動腳本中加了unset JAVA_TOOL_OPTIONS,因為當存在JAVA_TOOL_OPTIONS時,使用jdk相關的命令都會帶上JAVA_TOOL_OPTIONS中的參數(shù),造成一定的困擾,所以有時候在排查問題的時候會先unset掉這個變量,但是檢查完腳本也沒有問題。

最后開始咨詢阿里云的工程師,懷疑是不是agent或者容器環(huán)境有問題。經(jīng)過反復比較正常容器和問題容器的JAVA_TOOL_OPTIONS啟動參數(shù),發(fā)現(xiàn)問題容器因為多加載一個agent,JAVA_TOOL_OPTIONS多出來一段參數(shù),去掉這段參數(shù)就能恢復正常,加上就會有問題。到這里,可能正常的思路都是懷疑是多出來的參數(shù)造成的。但在排查其他正常容器時發(fā)現(xiàn),有的容器即使有這一段參數(shù)也能正常啟動。

這個時候,阿里云的工程師懷疑是不是參數(shù)太長導致的,因為有問題的容器的應用名字比較長,于是我們開始測試,發(fā)現(xiàn)確實是這個問題,如下圖所示。隨后確定了問題所在,jdk8 在加載默認環(huán)境變量時會檢查長度,當大于1024字節(jié)時就會加載失敗。

環(huán)境變量

在jdk相關的環(huán)境變量中,有兩種默認的環(huán)境變量 JAVA_TOOL_OPTIONS_JAVA_OPTIONS。

JAVA_TOOL_OPTIONS:在jdk8及之前版本中,該變量是最標準的,所有虛擬機都能識別和應用的環(huán)境變量,在jdk9之后被JDK_JAVA_OPTIONS所取代。該變量限制1024字節(jié),在不同虛擬機中表現(xiàn)不一樣,有的是加載失敗,有的是截取一段。

_JAVA_OPTIONS:也是默認的環(huán)境變量,但是它是JVM廠家自定義的,可以覆蓋JAVA_TOOL_OPTIONS,但各廠家的命名不同,_JAVA_OPTIONS是Oracle的JVM,而IBM的則是用IBM_JAVA_OPTIONS。

因此為避免出現(xiàn)問題,我們應該盡量避免使用默認的環(huán)境變量,通常情況下可以在腳本中自定義啟動變量如 JAVA_OPTSSPRINGBOOT_OPTS等等。然后在啟動java時顯式的指定啟動參數(shù)。

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

附:啟停腳本

項目打包后在測試環(huán)境的啟停都是個體力活,剛好又給筆者遇到了,綜合別人的腳本記錄了一下

判斷 Java 進程是否存在

APP_NAME=xxx.jar
pid=jps -l | grep $APP_NAME

if [ -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.jar

pid=0
checkpid() {
    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 start
exit 1
esac
exit 0

總結

到此這篇關于java啟動參數(shù)之謎的文章就介紹到這了,更多相關java啟動參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java本地緩存工具之LoadingCache的使用詳解

    Java本地緩存工具之LoadingCache的使用詳解

    緩存,在我們?nèi)粘i_發(fā)中是必不可少的一種解決性能問題的方法。簡單的說,cache?就是為了提升系統(tǒng)性能而開辟的一塊內(nèi)存空間。本文將為大家介紹一個Java本地緩存的工具——LoadingCache,感興趣的可以了解一下
    2021-12-12
  • Java多線程Future實現(xiàn)優(yōu)雅獲取線程的執(zhí)行結果

    Java多線程Future實現(xiàn)優(yōu)雅獲取線程的執(zhí)行結果

    這篇文章主要為大家詳細介紹了Java如何利用Future實現(xiàn)優(yōu)雅獲取線程的執(zhí)行結果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-07-07
  • spring在IoC容器中裝配Bean詳解

    spring在IoC容器中裝配Bean詳解

    這篇文章主要介紹了spring在IoC容器中裝配Bean詳解,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Java中的 VO,BO,DO 對象命名問題小結

    Java中的 VO,BO,DO 對象命名問題小結

    本文講解VO,BO,DO 的作用以及如何使用,分析了如何消除三者之間重復的代碼,同樣結合現(xiàn)實生活中領導配秘書來類比講解,對Java  VO  對象命名相關知識感興趣的朋友一起看看吧
    2024-01-01
  • SpringBoot實現(xiàn)物品收藏功能

    SpringBoot實現(xiàn)物品收藏功能

    這篇文章主要介紹了SpringBoot實現(xiàn)物品收藏功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 在eclipse中安裝Scala環(huán)境的步驟詳解

    在eclipse中安裝Scala環(huán)境的步驟詳解

    這篇文章主要介紹了在eclipse中安裝Scala環(huán)境的步驟,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Java流處理stream使用詳解

    Java流處理stream使用詳解

    Java8的另一大亮點Stream,它與java.io包里的InputStream和OutputStream是完全不同的概念,下面這篇文章主要給大家介紹了關于Java8中Stream詳細使用方法的相關資料,需要的朋友可以參考下
    2022-10-10
  • Java中操作Word修訂功能的示例詳解

    Java中操作Word修訂功能的示例詳解

    Word的修訂功能是一種在文檔中進行編輯和審閱的功能,它允許多個用戶對同一文檔進行修改并跟蹤這些修改,以便進行審查和接受或拒絕修改,下面我們就來學習一下Java中操作Word修訂功能的方法,需要的可以參考下
    2023-12-12
  • Java項目如何防止SQL注入(多種方案匯總)

    Java項目如何防止SQL注入(多種方案匯總)

    SQL注入即是指web應用程序對用戶輸入數(shù)據(jù)的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,這篇文章主要介紹了?Java項目防止SQL注入的四種方案,需要的朋友可以參考下
    2023-12-12
  • JavaWeb如何發(fā)送狀態(tài)碼方法解析

    JavaWeb如何發(fā)送狀態(tài)碼方法解析

    這篇文章主要介紹了JavaWeb如何發(fā)送狀態(tài)碼方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02

最新評論

葵青区| 麻阳| 岳阳县| 隆尧县| 卓尼县| 醴陵市| 雅江县| 平乡县| 土默特右旗| 吉林市| 张家界市| 精河县| 鄂伦春自治旗| 商南县| 博野县| 哈尔滨市| 日照市| 会泽县| 黄大仙区| 黔南| 陈巴尔虎旗| 海淀区| 乌审旗| 阿拉善左旗| 盘山县| 和政县| 江油市| 临泉县| 昭苏县| 安仁县| 图们市| 新和县| 邹城市| 长岛县| 同心县| 晋中市| 两当县| 濮阳市| 沧源| 栾川县| 盐池县|