kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

jhat使ってOutOfMemmoryになり解析できない

hprofファイルが大きいとjhat自身でOutOfMemmoryになる

set JAVA_OPTS=-Xmx4096m
jhat xxx.hprof

としても、ヒープサイズ指定は有効にならない 標準の起動では、javaのheap Max3GB手前くらいまでになってしまい、OutOfMemmoryで解析できない事象に遭遇した。

対応するには、jhatのオプションとしてheapサイズ指定が必要

jhat -J-Xmx6g xxx.hprof

この例では、6GB指定している

Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

のログがでるので、http://localhost:7000/ にブラウザ使って見る

windowsでcurlを使えると知って、

rem 対応OS windows10 ver1803

@ECHO OFF
:INPUT_START
ECHO +-------------------------------------------------------+
ECHO  IDを入力してください。:
ECHO +-------------------------------------------------------+
SET INPUT_ID=
SET /P INPUT_ID=
 
IF "%INPUT_ID%"=="" GOTO :INPUT_START

:INPUT_P

ECHO +-------------------------------------------------------+
ECHO パラメータを入力してください。:
ECHO +-------------------------------------------------------+
SET INPUT_P=
SET /P INPUT_P=
 
IF "%INPUT_P%"=="" GOTO :INPUT_P

:INPUT_CONF
ECHO +-------------------------------------------------------+
ECHO  入力した IDは[%INPUT_ID%]、パラメータ:[%INPUT_P%]ですか?
ECHO (Y / N)
ECHO +-------------------------------------------------------+
SET CONF_SELECT=
SET /P CONF_SELECT=
 
IF "%CONF_SELECT%"== SET CONF_SELECT=Y
IF /I NOT "%CONF_SELECT%"=="Y"  GOTO :INPUT_START


SET CURL_DATA="id=%INPUT_ID%&param=%INPUT_P%"

curl -m 3 --get https://example.com/xxx? --data %CURL_DATA% --verbose

:INPUT_END
ECHO +-------------------------------------------------------+
ECHO  HTTPリクエストが完了しました。
ECHO +-------------------------------------------------------+
 
PAUSE
EXIT

windowsでcurlを使えると知って、

rem 対応OS windows10 ver1803

@ECHO OFF
:INPUT_START
ECHO +-------------------------------------------------------+
ECHO  IDを入力してください。:
ECHO +-------------------------------------------------------+
SET INPUT_ID=
SET /P INPUT_ID=
 
IF "%INPUT_ID%"=="" GOTO :INPUT_START

:INPUT_P

ECHO +-------------------------------------------------------+
ECHO パラメータを入力してください。:
ECHO +-------------------------------------------------------+
SET INPUT_P=
SET /P INPUT_P=
 
IF "%INPUT_P%"=="" GOTO :INPUT_P

:INPUT_CONF
ECHO +-------------------------------------------------------+
ECHO  入力した IDは[%INPUT_ID%]、パラメータ:[%INPUT_P%]ですか?
ECHO (Y / N)
ECHO +-------------------------------------------------------+
SET CONF_SELECT=
SET /P CONF_SELECT=
 
IF "%CONF_SELECT%"== SET CONF_SELECT=Y
IF /I NOT "%CONF_SELECT%"=="Y"  GOTO :INPUT_START


SET CURL_DATA="userid=%INPUT_ID%&examid=%INPUT_P%"

curl -m 3 --get https://example.com/xxx? --data %CURL_DATA% --verbose

:INPUT_END
ECHO +-------------------------------------------------------+
ECHO  HTTPリクエストが完了しました。
ECHO +-------------------------------------------------------+
 
PAUSE
EXIT

GitHub ActionsのCI と maven(Java with Maven)その3

skip ci を取り入れる

  • 参考 GitHub Actions で Skip CI を実現する - Qiita
  • develop ブランチやfeatureブランチでpushをたくさんして、pushのたびに CI ・ビルドされると実行時間ばかり加算されてしまう
  • push で CIされないようにすれば良いので、jobsでskipciの定義を追加し、その結果がtrueの場合にbuildが動くようにすれば良い

developブランチでのbuild+skip ciのサンプル

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

jobs:
  skipci:
    runs-on: ubuntu-latest
    outputs:
      is_skip: ${{ steps.is_skip.outputs.is_skip }}
    steps:
      - name: Set is_skip
        id: is_skip
        run: echo "::set-output name=is_skip::${{ contains(github.event.head_commit.message, '[skip ci]') }}"
      - run: echo "[skip ci] ${{ steps.is_skip.outputs.is_skip }}"
       
  build:

    runs-on: ubuntu-latest
    needs: skipci
    if: ${{ ! needs.skipci.outputs.is_skip }}
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 1.7
      uses: actions/setup-java@v1
      with:
        java-version: 1.7
    - name: Install ojdbc14-10.2.0.4.0.jar
      run: mvn install:install-file -Dfile=./foo-project/lib/ojdbc14-10.2.0.4.0.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar
    - name: Cache Maven packages
      uses: actions/cache@v1
      with:
        path: ~/.m2
        key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
        restore-keys: ${{ runner.os }}-m2
    - name: Build with Maven
      run: mvn clean package -P dev -f ./foo-project/pom.xml
    - name: Archive WAR
      if: always()
      uses: actions/upload-artifact@v1
      with: 
      
      ......
  • 説明

    • skipciを定義し、pushのメッセージに、”skip ci”がcontains含まれているか判定し、その結果を後続が判定する
    • build側で、「needs: skipci」とし、「if: ${{ ! needs.skipci.outputs.is_skip }}」のfalse(skip ci が含まれない)場合のみbuildを続行するようにする
  • 実際にactionsが動く時間、1-2秒程度で skip ciまでの判定がされ後続が処理されなくなる

  • echo することで、actionsの結果で以下のようなログがとれる
Set up job   0s

Prepare all required actions
Current runner version: '2.263.0'
Operating System
Virtual Environment
Prepare workflow directory
Prepare all required actions

Set is_skip   1s

  shell: /bin/bash -e {0}
Run echo "::set-output name=is_skip::true"
  echo "::set-output name=is_skip::true"
  shell: /bin/bash -e {0}
  Run echo "[skip ci] true"0s
  shell: /bin/bash -e {0}

Run echo "[skip ci] true"
  echo "[skip ci] true"
  shell: /bin/bash -e {0}
[skip ci] true

Complete job   0s

Cleaning up orphan processes
Evaluate and set job outputs
Set output 'is_skip'
Cleaning up orphan processes

GitHub ActionsのCI と maven(Java with Maven)その2

Tips

  • 以前はOracleJDBCドライバーのjarをsystempathでなく、Actionsの ~./m2 にinstallして使う方法でした
  • 今回はmavenリポジトリのキャッシュ・依存関係をキャッシュ
    • キャッシュすることでワークフローの実行時間を短くできます。実際のプロジェクトでwarにしたときにWEB-INF/libに入るjar30個くらいある場合で1分程度短くなった。Actionsは利用時間分で無料利用枠がある、その利用時間は1ヶ月単位でリセットされる。

依存関係のキャッシング

    - name: Cache Maven packages
      uses: actions/cache@v1
      with:
        path: ~/.m2
        key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
        restore-keys: ${{ runner.os }}-m2

    - name: Build with Maven
      run: mvn clean package -P release -f ./foo-project/pom.xml