@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/11/002-handle-leak-industrial-camera-long-run-crash-part1/#article>
    schema:about <https://comcomponent.com/knowledge/handle-leak/>, <https://comcomponent.com/knowledge/handle-count/> ;
    schema:mentions <https://comcomponent.com/knowledge/private-bytes/>, <https://comcomponent.com/knowledge/thread-count/>, <https://comcomponent.com/knowledge/memory-leak/>, <https://comcomponent.com/knowledge/createevent-api/>, <https://comcomponent.com/knowledge/closehandle/>, <https://comcomponent.com/knowledge/structured-logging/>, <https://comcomponent.com/knowledge/application-verifier/>, <https://comcomponent.com/knowledge/raii/>, <https://comcomponent.com/knowledge/gdi-object/>, <https://comcomponent.com/knowledge/failure-path/>, <https://comcomponent.com/knowledge/secondary-failure/>, <https://comcomponent.com/knowledge/long-run-crash-investigation/> .

<https://comcomponent.com/knowledge/handle-leak/> a skos:Concept ;
    skos:prefLabel "ハンドルリーク"@ja ;
    skos:definition "参照カウントやハンドルカウントの数え違いなどにより、不要になったハンドル(ファイル・イベント・スレッド・GDIオブジェクト・アクセストークンなどカーネルオブジェクトへの参照)が解放されずに積み上がっていく状態。"@ja ;
    skos:altLabel "Handle Leak" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/handle-count/> ;
    ks:mayCause <https://comcomponent.com/knowledge/secondary-failure/> .

<https://comcomponent.com/knowledge/handle-count/> a skos:Concept ;
    skos:prefLabel "Handle Count"@ja ;
    skos:definition "プロセスが現在開いているハンドルの総数を表す、Windowsプロセスの計測値。"@ja ;
    skos:altLabel "ハンドルカウント"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/long-run-crash-investigation/> .

<https://comcomponent.com/knowledge/failure-path/> a skos:Concept ;
    skos:prefLabel "failure path(異常系の途中失敗経路)"@ja ;
    skos:definition "timeout・reconnect・early returnなど、正常系ではなく処理が途中で失敗して抜けるコード経路。資源の解放漏れが起きやすい。"@ja ;
    skos:altLabel "Failure Path" ;
    skos:altLabel "異常系経路"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/handle-leak/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/long-run-crash-investigation/> .

<https://comcomponent.com/knowledge/memory-leak/> a skos:Concept ;
    skos:prefLabel "メモリリーク"@ja ;
    skos:definition "確保したメモリを解放し忘れ、Private BytesやCommitが増え続ける現象。"@ja ;
    skos:altLabel "Memory Leak" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/private-bytes/> .

<https://comcomponent.com/knowledge/private-bytes/> a skos:Concept ;
    skos:prefLabel "Private Bytes"@ja ;
    skos:definition "プロセスが専有しているコミット済みメモリ量を表す、Windowsプロセスの計測値。"@ja ;
    skos:altLabel "プライベートバイト"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/long-run-crash-investigation/> .

<https://comcomponent.com/knowledge/createevent-api/> a skos:Concept ;
    skos:prefLabel "CreateEvent"@ja ;
    skos:definition "イベントオブジェクトを作成し、そのハンドルを返すWin32 API。呼び出し元は使用後にCloseHandleでハンドルを解放する必要がある。"@ja ;
    skos:altLabel "CreateEventW" ;
    ks:requires <https://comcomponent.com/knowledge/closehandle/> .

<https://comcomponent.com/knowledge/closehandle/> a skos:Concept ;
    skos:prefLabel "CloseHandle"@ja ;
    skos:definition "プロセスのハンドルテーブルからエントリを1つ削除するWin32 API。「ファイルを閉じる」ことそのものではない。"@ja ;
    skos:altLabel "CloseHandle API" ;
    ks:prevents <https://comcomponent.com/knowledge/handle-leak/> .

<https://comcomponent.com/knowledge/structured-logging/> a skos:Concept ;
    skos:prefLabel "構造化ログ(structured log)"@ja ;
    skos:definition "文章ではなくkey=valueのように項目を決めて出力し、あとで機械的に集計できるログの形式。"@ja ;
    skos:altLabel "Structured Logging" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/handle-leak/> ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/application-verifier/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/secondary-failure/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/long-run-crash-investigation/> .

<https://comcomponent.com/knowledge/application-verifier/> a skos:Concept ;
    skos:prefLabel "Application Verifier"@ja ;
    skos:definition "Windowsのuser-modeアプリに対するランタイム検証ツールで、OS API利用や資源の扱い方を監視し誤用の検出や意図的な失敗の注入を行う。"@ja ;
    skos:altLabel "AppVerifier" ;
    skos:altLabel "appverif.exe" .

<https://comcomponent.com/knowledge/raii/> a skos:Concept ;
    skos:prefLabel "RAII(Resource Acquisition Is Initialization)"@ja ;
    skos:definition "オブジェクトの生成時に資源を確保し、デストラクタでの解放を保証することで、途中失敗時にも資源が漏れないようにするC++の設計パターン。"@ja ;
    skos:altLabel "RAII" ;
    ks:prevents <https://comcomponent.com/knowledge/handle-leak/> .

<https://comcomponent.com/knowledge/secondary-failure/> a skos:Concept ;
    skos:prefLabel "二次障害(secondary failure)"@ja ;
    skos:definition "資源の枯渇などが積み重なった結果として、本来の原因(漏らした場所)から離れた場所で表面化する障害。"@ja ;
    skos:altLabel "Secondary Failure" .

<https://comcomponent.com/knowledge/gdi-object/> a skos:Concept ;
    skos:prefLabel "GDIオブジェクト"@ja ;
    skos:definition "ペン・ブラシ・デバイスコンテキストなどGDIが管理する描画資源で、プロセスあたりの既定上限に達するとそれ以上作成できなくなる。"@ja ;
    skos:altLabel "GDI Objects" .

<https://comcomponent.com/knowledge/long-run-crash-investigation/> a skos:Concept ;
    skos:prefLabel "長時間運転後クラッシュの切り分け"@ja ;
    skos:definition "数日〜数週間の連続稼働後にだけ発生する障害を、資源の増え方と失敗経路の観測から原因究明する調査手法。"@ja ;
    skos:altLabel "Long-Run Crash Investigation" .

<https://comcomponent.com/knowledge/thread-count/> a skos:Concept ;
    skos:prefLabel "Thread Count"@ja ;
    skos:definition "プロセスが持つスレッド数を表す計測値。"@ja ;
    skos:altLabel "スレッド数"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/long-run-crash-investigation/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/failure-path/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/handle-leak/> ;
    schema:description "timeout・reconnect・early returnなどの途中失敗経路でCloseHandleが呼ばれないと、ハンドルリークの原因になることがある。"@ja ;
    ks:evidence <https://cwe.mitre.org/data/definitions/772.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/handle-leak/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/handle-count/> ;
    schema:description "ハンドルリークは、reconnectなどの操作後にHandle Countが戻らずじわじわ増え続けることで確認できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesshandlecount> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/memory-leak/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/private-bytes/> ;
    schema:description "メモリリークはPrivate Bytes(やCommit)がじわじわ増えることで確認できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/psapi/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/createevent-api/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/closehandle/> ;
    schema:description "CreateEventが返したイベントハンドルは、使用後にCloseHandleで解放することを前提とする。CloseHandle自体はファイル・プロセス・スレッド・ミューテックスなど多くのカーネルオブジェクトのハンドルを閉じるもので、CreateEventに限らない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-createeventw> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/structured-logging/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/handle-leak/> ;
    schema:description "create/openとclose/disposeの対応が崩れている箇所は、sessionId・resourceId・actionを持つ構造化ログで探すことが本記事の推奨対応である。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/extensions/logging/overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/structured-logging/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/application-verifier/> ;
    schema:description "後編で扱うApplication Verifierを使う前に、自前の構造化ログでlifetimeの崩れを追えるようにしておくのが土台になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/application-verifier> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/raii/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/handle-leak/> ;
    schema:description "RAII型でハンドルの生存期間をオブジェクトの生存期間に結び付けると、途中失敗の経路でも自動的にCloseHandleが呼ばれるためハンドルリークを防げる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/cpp/cpp/smart-pointers-modern-cpp?view=msvc-170> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/raii/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/closehandle/> ;
    schema:description "Windowsのハンドルを保持するRAII型では、デストラクタが保持しているハンドルに対してCloseHandleを呼んで解放する。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/application-verifier/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/handle-leak/> ;
    schema:description "Application Verifierは低リソース時のfailure pathを前倒しで踏ませることで、ハンドルリークのような出にくい壊れ方を早期に表面化させる有効な手段とされる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/application-verifier> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/handle-leak/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/secondary-failure/> ;
    schema:description "ハンドルリークは、蓄積の結果として新しいevent/file/threadを作るAPIの失敗という形で、数週間後に二次障害として表面化することが多い。クラッシュ地点は漏らした場所ではなく最後の被害者であることが多い。"@ja ;
    ks:evidence <https://cwe.mitre.org/data/definitions/772.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/structured-logging/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/secondary-failure/> ;
    schema:description "session/resource lifecycleの構造化ログをたどることで、落ちた場所ではなく漏らした場所という二次障害の本当の原因を特定することが本記事の推奨対応である。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/extensions/logging/overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/closehandle/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/handle-leak/> ;
    schema:description "途中失敗の経路も含めてCloseHandleを漏れなく呼ぶことが、ハンドルリークの防止そのものになる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/gdi-object/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/secondary-failure/> ;
    schema:description "GDIオブジェクトのハンドルを漏らした場合、プロセスあたりの既定上限(GDIProcessHandleQuotaで256〜65,536)がカーネルオブジェクトの理論上限より低いため、GUIが同居するアプリではこちらに先に達し、新しい描画資源を作れなくなって二次障害として表面化することがある。CreateEventのようなカーネルハンドルの漏れ自体はGDIの枠を消費しない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/sysinfo/gdi-objects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/handle-count/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/long-run-crash-investigation/> ;
    schema:description "長時間運転後にだけ落ちるアプリの切り分けでは、Private Bytesだけでなく Handle Countも必ず見ることが推奨される。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesshandlecount> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/structured-logging/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/long-run-crash-investigation/> ;
    schema:description "落ちた瞬間の例外だけでなく、operation/session/resource lifecycleの構造化ログを先に整えておくことが、長時間運転後クラッシュの切り分けに効く。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/extensions/logging/overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/failure-path/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/long-run-crash-investigation/> ;
    schema:description "長時間運転後クラッシュの切り分けでは、月単位の再現を待たず、timeout・reconnect・early returnなどのfailure pathを短いループで大量に踏んで再現を圧縮することを本記事は推奨している。"@ja ;
    ks:evidence <https://cwe.mitre.org/data/definitions/772.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/private-bytes/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/long-run-crash-investigation/> ;
    schema:description "長時間運転後にだけ落ちるアプリの切り分けでは、Handle Countと合わせてPrivate Bytesも継続的に見ることで、主犯がメモリかハンドルかを切り分けられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/psapi/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/thread-count/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/long-run-crash-investigation/> ;
    schema:description "長時間運転の切り分けでは、スレッドリークの可能性を除外するため、Handle Count・Private Bytesと並んでThread Countも一緒に見ることが基本になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/procthread/processes-and-threads> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
