「プログラミング」カテゴリーアーカイブ

Javaメモリ管理の仕組み:ガーベジコレクションとヒープの基本

1. Javaのメモリ管理とは?

Javaはプログラマーが手動でメモリを解放しなくても良い言語です。
C・C++のように free() を使う必要はありません。

Javaでは、必要なくなったオブジェクトを自動で回収(解放)する仕組みが備わっています。
これを**ガーベジコレクション(Garbage Collection, GC)**と呼びます。

「解放漏れによるメモリリークが発生しづらい」
→ Javaが幅広く使われる理由の1つ


2. Javaのメモリ領域:ヒープとスタック

Javaアプリのメモリは主に次の2領域で管理されます。

領域役割特徴
ヒープ(Heap)オブジェクト、配列を格納GCの対象
スタック(Stack)メソッド実行中の変数・参照メソッド終了で自動解放

ヒープ領域の構造(JDK8以降)

領域内容
Young Generation新規オブジェクト領域(Eden、Survivor)
Old Generation長生きするオブジェクト領域

多くのオブジェクトはすぐ不要になる → Young に多く配置するのが効率的


3. ガーベジコレクションの動き

ガーベジコレクションは、参照されなくなったオブジェクトを検出・削除します。

処理の流れ

  1. オブジェクトを生成(ヒープに配置)

  2. 参照が切れる or 到達不能になる

  3. GCが不要オブジェクトを回収

GCアルゴリズム(代表)

名称特徴
Mark and Sweep到達可能オブジェクトに印を付け、残りを削除
Copying生きているオブジェクトを別領域に移動して残りを破棄
Generational GC世代(Young/Old)でGC動作を変える効率化方式

4. Javaの主要GC方式(JDKバージョン別)

GC機能特徴対象バージョン
Serial GCシングルスレッド、単純設計軽量アプリ
Parallel GC並列処理で高速デフォルト(Java8)
G1 GC大規模ヒープ向け、低停止時間Java9以降推奨
ZGC超低遅延GC、数百GB〜TB向けJava15以降
ShenandoahRedHat版、低遅延OpenJDK系

5. よくあるメモリ関連エラー

java.lang.OutOfMemoryError

ヒープ不足で発生
→ ヒープ拡張 or メモリリーク調査

StackOverflowError

再帰のしすぎなどでスタック溢れ

❌ メモリリーク

Javaでも発生します(例:Listにaddしっぱなし)


6. メモリ管理・GCチューニングのポイント

対策内容
不要な参照を早く消すローカル変数は小スコープ
大規模データは逐次処理巨大Listを避けIterator活用
WeakReference活用キャッシュ管理時に便利
GCログ・ツール利用-Xmx設定、VisualVM/FlightRecorder

JVMオプション例


7. まとめ

ポイント内容
Javaは自動メモリ管理ガーベジコレクションが解放処理
ヒープが主な領域Young/Old世代で効率化
GC方式は進化中G1GC・ZGCが主流
最適化の余地あり適切なコーディング+JVM設定

「自動だから安心」ではなく、仕組み理解でパフォーマンス向上!

PowerShellでリモートサーバーを操作!Enter-PSSessionとInvoke-Commandの使い方

リモートサーバーをPowerShellで操作したいけど、何を使えばいいの?
そんな疑問に答えるのが、Enter-PSSessionInvoke-Command の2つです。

どちらもPowerShellのリモート管理コマンドですが、使いどころが異なります。

コマンド用途動作
Enter-PSSession1台のサーバーに対して対話的に操作SSHのように「接続してその場でコマンド実行」
Invoke-Command複数サーバーに対して一括実行可能コマンドを送って結果を受け取る

この記事では、初心者でも確実に理解できる具体例と、業務で使えるセキュアな設定方法まで解説します。


事前準備:WinRMが有効か確認

PowerShellリモートを使うには、WinRM(Windows Remote Management) が有効である必要があります。

WinRM状態確認

有効化(必要な場合)


1. Enter-PSSession:対話形式でリモート接続

接続コマンド

  • server01 → 接続先ホスト名(IPでも可)

  • Get-Credential → ユーザー名とパスワード入力画面を出す

実行例

切断

用途例

  • 単体サーバーの手動確認作業

  • ログ確認、サービス再起動テストなど


2. Invoke-Command:コマンドをリモート実行

単一サーバーへコマンド実行

複数サーバーへまとめて実行

実行結果を変数で受け取る

用途例

  • 定期メンテ(サービス状態取得、ログ収集)

  • 複数サーバーの一括設定変更


セキュアに使う:認証方法のポイント

資格情報を変数に保持

HTTPS通信を利用する場合

管理セキュリティポリシーが厳しい企業ネットワークではHTTPSリモート設定が推奨される場合もあります。


よくあるエラーと対処

エラー原因対処
WinRM cannot process the requestWinRM無効Enable-PSRemoting -Force
Access is denied権限不足管理者権限or適切なアカウント
Kerberos 認証エラーWorkgroup環境TrustedHosts設定 or HTTPS

TrustedHosts 例:


実務Tips:こんな時に便利

✅ 監視スクリプト
✅ バッチ反映の自動化
✅ 管理サーバーから20台へ一括処理
✅ 休日バッチメンテの効率化

PowerShellリモートは、定型作業の自動化サーバー負荷・ログ確認の省力化に非常に強力です。


まとめ

使い分け特徴
Enter-PSSession1台に接続して手動操作
Invoke-Command複数サーバーに対して一括命令

まずはEnter-PSSessionで慣れ、
次にInvoke-Commandで自動化へ進みましょう。

Java:IllegalArgumentExceptionの意味と例外設計のベストプラクティス

Javaアプリケーション開発では「想定外の入力」に対して適切にエラーを発生させ、プログラムの異常動作を防ぐことが重要です。その際によく使用される例外のひとつが IllegalArgumentException です。

本記事では、IllegalArgumentException の意味、発生するケース、使い方の例、そして例外設計のベストプラクティスまで徹底解説します。


IllegalArgumentExceptionとは?

IllegalArgumentException とは、

メソッドに不正な引数(値)が渡された場合にスローされる実行時例外(RuntimeException)

です。

例えば、年齢を受け取るメソッドに 負の値 が渡された場合など、
「引数の値が意味を成していない」状態で使われます。


なぜIllegalArgumentExceptionを使うのか?

✔ 不適切な入力を早期に検知
✔ 異常な状態を防ぎ、予測可能な動作を保証
✔ 開発者や利用側に明確なフィードバック

特に、ライブラリ・APIの開発時には重要です。
「どんな値が許容されるのか?」を明確にすることで利用者のミスを防げます。


IllegalArgumentExceptionの基本例

✅ 正の値のみ受け付けるメソッド例

チェックポイント

  • 条件式で検証

  • 明確なメッセージで何が悪いか伝える


Integerチューター:標準APIにも見る例

Java標準APIも積極的にこの例外を使っています。

例:Thread#setPriority(int priority)

Java公式の一貫性ある設計に従うことで、コード品質が向上します。


IllegalArgumentException vs 他の例外

例外使う場面
IllegalArgumentException引数の値が不正
NullPointerException引数がnull不可なのにnull
IllegalStateExceptionオブジェクトの状態が不正
IOExceptionI/O操作中の問題

ポイント

  • 値がおかしい→IllegalArgumentException

  • 状態がおかしい→IllegalStateException


ベストプラクティス:例外設計ガイド

✅ 1. 早めにチェックする(Fail Fast)

異常はできるだけ早く発見しましょう。

✅ 2. メッセージで原因を明示

悪い例(NG)

何が悪いのか分からない…

✅ 3. Javadocで事前に仕様を明記

APIの信頼性が向上します。

✅ 4. nullチェックはObjects.requireNonNullで簡潔に


ユースケース:バリデーションロジックの整理方法

例外処理が肥大化しないよう、専用バリデータクラスを作るアプローチも有効です。

利用例:


まとめ

ポイント内容
例外名IllegalArgumentException
意味不正な引数が渡された
目的予期しない動作を防ぐ
コツFail Fast、明確なメッセージ、仕様明記

良い例外設計はコードの信頼性・保守性を大きく高めます。
実務でも積極的に活用していきましょう!

PowerShellスクリプトの基本構文まとめ:変数・条件分岐・ループを完全マスター

Windowsの自動化やサーバ運用で大活躍するPowerShell。
「使い始めたいけど、基本構文がよく分からない…」という人向けに、この記事ではPowerShellの基礎構文を一気に整理します。

以下の内容を押さえることで、シンプルなスクリプトはすぐ書けるレベルになります。


✅ PowerShellスクリプトの基本ルール

内容説明
拡張子.ps1
コメント# コメント
大文字小文字区別しない (例: $Value と $value は同じ)
変数宣言$変数名 = 値
実行ポリシー変更Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

💡 セキュリティのため、実行ポリシー設定は理解したうえで操作しましょう。


🧮 変数の基本 

ポイント

  • $ を付けて変数を宣言

  • 文字列中で変数展開できる


🔁 配列(リスト) 


📦 ハッシュテーブル(連想配列) 


✅ 条件分岐(If / ElseIf / Else) 

よく使う比較演算子

演算子意味
-eq等しい
-ne等しくない
-gtより大きい
-ltより小さい
-ge以上
-le以下

🔁 ループ制御

for文

foreach文 


🔄 while / do-while 


📦 関数の定義 


📎 パイプラインとフィルタ

コマンド説明
Get-Processプロセス一覧取得
Where-Object条件絞り込み
Sort-Object並び替え
Select-Object指定列のみ取得

💡 実用例:ファイル一覧を取得して出力


🎯 まとめ

PowerShellの基本構文は次の通り:

  • ✅ 変数 $var = 値

  • ✅ 条件分岐 if () {}

  • ✅ ループ for / foreach / while

  • ✅ ハッシュテーブル @{ Name = "A" }

  • ✅ 関数 function X(){}

  • ✅ パイプライン |

まずは小さな処理から試し、Windows作業をどんどん自動化していきましょう!


❓ よくある質問(FAQ)

Q. PowerShell ISEとWindows Terminalどっち使うべき?
A. 基本は Windows Terminal + VS Code を推奨。補完機能が強いです。

Q. 管理者権限はいつ必要?
A. ファイル操作・レジストリ操作・サービス制御等で必要になります。

【Java初心者向け】staticって何?よくある質問を例付きで解説

Javaを学び始めると、最初に必ずと言っていいほど出てくるキーワードがstatic
でも、

  • staticって具体的に何をしているの?

  • いつ使うべき?

  • staticをつけないとどうなるの?

という疑問を持つ方が多いです。

この記事では、できるだけ分かりやすくstaticの意味や使いどころを例を交えて解説します。


staticとは?

staticクラスに属するという意味です。
通常の変数やメソッドはインスタンス(newで作ったオブジェクト)に属しますが、staticクラス自体に属するため、オブジェクトを作らずに使うことができます。


よくある疑問と回答


Q1. なぜmainメソッドにはstaticが付いているの?

A:Javaプログラムを実行するとき、まず「クラス」を読み込むから。

プログラム開始時点ではまだオブジェクトがありません。
そこで、オブジェクト不要で実行できるようにするためstaticが付いています。


Q2. static変数と普通の変数の違いは?

種類所属使うタイミング
インスタンス変数オブジェクトオブジェクトごとに独立した値を持ちたいとき
static変数クラス全オブジェクトで共有したいとき
例:カウンター(全インスタンスで共有)

countは全インスタンスで共有されるため、2回インスタンス化すると値が2になります。


Q3. staticメソッドっていつ使うの?

  • ユーティリティ処理

  • 共通的な値や処理

  • インスタンスの状態に依存しないメソッド

例:Mathクラス

Mathクラスはnewしません。
staticの代表例です。


Q4. staticを付けすぎるとどうなる?

オブジェクト指向らしさが失われます。

  • 何でもかんでもstatic → 関数型プログラムみたいになる

  • 状態(フィールド)を持つ設計が難しくなる

✅ ルール

  • 状態を持つもの → インスタンス

  • 共通処理 → static


まとめ

用語意味
staticクラスに属する(オブジェクト不要)
static変数全インスタンスで共通の変数
staticメソッドインスタンスに依存しない処理
mainメソッドがstaticな理由最初はオブジェクトがないため

まずは「オブジェクト不要で使える」だけ覚えてOK!
使いながら感覚をつかみましょう ✅

PowerShell正規表現攻略ガイド:文字列操作が劇的に速くなる実践技

PowerShellでのテキスト処理で、もっと効率良く抽出・置換したいと思ったことはありませんか?
そんなときに威力を発揮するのが**正規表現(Regex)**です。

ログ解析、ファイル名整形、データ抽出、フォーマット変換など、
業務効率が劇的に変わる超重要スキルです。

本記事では、PowerShell × 正規表現の基本から実務で使えるテクニックまで徹底解説します。


正規表現の基本:PowerShellでの使い方

マッチ判定 -match

否定パターン

文字列からValue取得

$matches[1] にキャプチャした文字列が入る


よく使う正規表現パターン

用途パターン
数字\d+1234
英字[A-Za-z]+UserName
メール\w+@\w+\.\w+test@mail.com
日付\d{4}/\d{2}/\d{2}2025/01/10
任意の文字列.*?全部

実践例:ログからIPアドレスだけ抽出

出力


置換:-replaceでデータ整形

電話番号のハイフン削除

メールのドメインを隠す


ファイル名の一括リネーム

大量ファイルの命名変換で超便利


キャプチャした値を使った置換

日付フォーマット変換(YYYY/MM/DD → YYYY-MM-DD)


否定・条件抽出の例

IP行だけ抽出

エラー行だけ取得

“Warning”を含まない行


欲しいパターンはGitHub Copilotじゃなく、正規表現辞書を使え!

以下のキーワードで検索すると精度高い例が見つかります👇


まとめ

機能PowerShellでのコマンド
マッチ判定-match / -notmatch
抽出$matches[]
検索Select-String
置換-replace
ファイル検索Get-ChildItem + Select-String

正規表現を使いこなすと、
データ処理・ログ解析・自動化スクリプトが一気にプロレベルになります。

PowerShellでログ収集とバックアップを自動化する実践スクリプト

システム運用や開発現場では、ログ収集やバックアップ作業を「手動で行う」ケースがまだ多く残っています。しかし、PowerShellを使えばこれらを自動化し、毎日の定型作業を一気に効率化できます。

この記事では、**「ログを自動収集してバックアップするPowerShellスクリプト」**を実例付きで紹介します。
スクリプトはWindows環境でそのまま動作し、日次・週次の定期ジョブとしても活用可能です。


⚙️ 実践スクリプト:ログ収集&バックアップ自動化

以下のスクリプトは、

  • ログフォルダをスキャン

  • 日付別フォルダにコピー

  • 古いバックアップを自動削除
    する一連の処理を行います。


📦 処理の流れ

処理内容
① 初期設定ログフォルダ・バックアップフォルダ・保持日数を設定
② 日付フォルダ作成yyyyMMdd形式で新しいバックアップフォルダを作成
③ ログコピー対象フォルダからすべての.logファイルをコピー
④ 古いフォルダ削除30日より古いフォルダを自動削除

🕒 定期実行する方法(Windows タスクスケジューラ)

  1. Windows検索バーで「タスクスケジューラ」と入力して起動

  2. 「基本タスクの作成」→ タスク名を「ログバックアップ」とする

  3. 「毎日」または「毎週」を選択

  4. 「操作」で「プログラムの開始」を選択し、以下を指定

    Program/script: powershell.exe
    Add arguments: -File "D:\Scripts\log_backup.ps1"
  5. 完了後、右クリック → 「プロパティ」 → 「最上位の特権で実行する」を有効にする


💡 応用ポイント

  • ZIP圧縮も追加可能Compress-Archiveを使ってバックアップサイズを削減

  • ログローテーション:ファイルサイズや日付で自動的にローテーションするよう拡張可能

  • メール通知:バックアップ完了後にSend-MailMessageで報告を送信可能

  • CSVやJSON対応:ログ形式が異なる場合もGet-ContentConvertFrom-Jsonなどで加工可能


🚀 まとめ

PowerShellを使えば、GUI操作では面倒なログバックアップを簡潔に自動化できます。
1日1回の定期タスクに登録するだけで、手動の手間を大幅削減。
運用の安定化にもつながります。

ポイント:小さなスクリプトでも「業務時間を削減」できるのがPowerShellの強みです。

Java 8以上でリストをマージ・変換・フィルタリングするプロ向け実践術

✅ はじめに:Java 8以降の開発では「リスト操作力」が問われる

Java 8以降、Stream APIの登場によってListの操作が劇的に効率化されました。
しかし──

✅ addAllやfor文と混在してコードが読みづらくなる
✅ mapとflatMapを使い分けられない
✅ filterの順序ミスでパフォーマンス劣化
✅ null対策が甘く実行時例外が発生
✅ collectの最適な書き方がわからない

…といった悩みを抱える開発者は少なくありません。

本記事では、**「プロが実務で使うリスト処理の実践術」**を、マージ・変換・フィルタリングに焦点を当てて徹底解説します。


✅ Stream APIの基本構造

✅ Streamは元のリストを壊さない(非破壊的)
✅ 中間操作は評価されず蓄積 → 終端操作で初めて実行
✅ メソッドチェーンで可読性UP


✅ 1. リストをマージ(結合)する3つの実践パターン

❗ 従来の書き方(非推奨)

✅ ① Stream.concat()

✅ ② flatMapを使った複数リスト統合

✅ リストを動的に渡す場合にも有効


✅ 2. リストの変換(map・flatMap)実践術

✅ map(1対1変換)

✅ flatMap(1対多変換に最適)

✅ 「map + 非Stream返却」ならmap
✅ 「map + Stream返却」ならflatMap


✅ 3. フィルタリング(filter)応用パターン

✅ 基本

✅ 複数条件

✅ Optional併用(null安全)


✅ 4. プロが多用する応用操作

操作用途サンプル
distinct重複削除.distinct()
sorted並び替え.sorted(Comparator.comparing(User::getAge))
groupingByグループ化Collectors.groupingBy(User::getDepartment)
collectingAndThen集約後処理.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList))

✅ Before / Afterで理解:IDの重複を削って並べる

❌ 従来(冗長)

✅ Stream版(たった1行)


✅ 5. パフォーマンス注意点

NGOK理由
filter後にmapmap後にfilterマッピングが無駄になる
distinct前にmapmap後にdistinct重複を早く削る
flatMap多用必要時のみネストが深いと重い
無闇なparallel()データ量が少ないと逆効果

✅ 最後に:Stream APIは「読みやすく・壊さない」が正解

✅ 冗長なfor文はStreamで置き換え
✅ mapとflatMapは「1対1」「1対多」で使い分け
✅ filterは前処理に最適
✅ Optional併用でnull対策
✅ groupByやdistinctで実務効率化

「使える」から「読みやすい」「安全」「再現性のある」コードへ。

Mapの操作がここまで楽になる!Java 8のcomputeIfAbsent/merge徹底活用術

はじめに:Map操作、まだ「containsKey」で書いていませんか?

JavaでMapを使うとき、以下のようなコードを書いた経験はありませんか?

Java 8以前ではこれが一般的でした。しかしJava 8では、computeIfAbsentmergeを使うことで、こうした冗長なコードをたった1行で表現できます!

本記事では、これらのメソッドの使い方から実践例まで徹底的に解説します。


✅ computeIfAbsentとは?

🔍 役割

キーが存在しないときに初期値を生成しMapに登録する。

📌 シグネチャ

✅ 使用例:リストを保持するMapに要素を追加する場合

📉 Before(従来のコード)

📈 After(computeIfAbsentで1行に)

👉 このように、存在確認不要でスッキリ!


✅ mergeとは?

🔍 役割

指定したキーに対して、既に値がある場合は「結合処理」を行い、新規ならそのまま値を格納。

📌 シグネチャ

✅ 使用例:カウントアップ処理

📉 Before(キー存在チェックあり)

📈 After(mergeで1行)

👉 キーがなければ1を設定。あれば現在値と1を足す。美しい!


✅ computeIfAbsentとmergeの使い分け

ケース推奨メソッド
値を「初期化してから操作」したいcomputeIfAbsent
「集計・加算・結合」したいmerge
ListやSetを使うMapに要素を追加したいcomputeIfAbsent
数値や文字列をまとめたいmerge

✅ さらに活用例:文字列の出現回数カウント

📤 出力:

{apple=2, banana=2, orange=1}

✅ Listを使ったグルーピングも簡単に!

📤 出力:

{A=[Apple, Avocado], B=[Banana]}

✅ まとめ:Map操作はJava 8で劇的にスマートになる!

キーワード内容
computeIfAbsent値がない場合のみ初期化
merge既存値と競合処理(加算・結合など)
メリットif文不要・コードが短く読みやすくなる

if文から卒業!Java 8のPredicateで条件分岐をスマートに書く方法

Javaで複雑な条件分岐が増えてくると、if文がネストして読みにくくなる…という悩みを抱えたことはありませんか?
Java 8で追加された**Predicateインターフェース**を使えば、条件式をオブジェクトとして扱えるため、よりスマートで再利用可能な形にできます。

本記事では、Predicateの基本から複数条件の組み合わせ、実用的な活用例まで分かりやすく解説します。


✅ Predicateとは?

Predicate<T> はJava 8で導入された関数型インターフェースで、**「引数を1つ受け取り、booleanを返す関数」**を表します。

test()メソッドに条件式を実装することで、条件判定を行うことができます。


✅ 基本的な使い方

✔ Lambda式で判定条件を定義

ここで、age -> age >= 20 という条件式がPredicateとして表現されています。


✅ 条件を組み合わせる(and/or/negate)

Predicateは以下のような便利なメソッドを持っています。

メソッド説明使用例
and()両方trueでtrueAND条件
or()どちらかtrueでtrueOR条件
negate()条件を反転NOT条件

✔ 使用例


✅ 実用例①:従来のif文から置き換えてスマートに

❌ 従来のif文

✅ Predicateを使った場合

→ 条件式をPredicateとして切り出すことで、再利用しやすくなります。


✅ 実用例②:Listのフィルタリングに活用

stream().filter() と組み合わせるとさらに強力です。

→ 条件式が外部に切り出されることで、読みやすく拡張しやすいコードになります。


🎯 Predicateを使うメリット

項目従来のif文Predicate
可読性ネストしやすい条件名で意図が明確
再利用性条件をコピペ使い回し可能
拡張性if追加が必要and/orで柔軟に拡張

⚠ 濫用しすぎには注意!

Predicateは便利ですが、小規模な処理に無理に使うと逆に複雑化することがあります。
「条件が複数箇所で使い回せる場合」や「複雑なAND/OR条件を定義したい場合」に効果を発揮します。


✅ まとめ

項目内容
Predicateとはbooleanを返す関数型インターフェース
基本test() で条件判定
条件組み合わせand/or/negateでスマートに
実用例if文の代替・Streamのfilterで活躍
メリット可読性・再利用性UP

👉 if文が増えて可読性が下がってきたと感じたら、まずは小さな条件式からPredicate化してみましょう!