Java変数で現在使用されているメモリ位置にアクセスしたい。Cまたは別の言語を使用してこれらの場所にアクセスする予定であり、場所の値を変更する予定です。
Javaプログラムにアクセスするプログラムは、プログラムを制御できません。メモリを検索することでこのタスクを実行します。
この2番目のプログラムの書き方についてアドバイスが必要です。
Java変数で現在使用されているメモリ位置にアクセスしたい。Cまたは別の言語を使用してこれらの場所にアクセスする予定であり、場所の値を変更する予定です。
Javaプログラムにアクセスするプログラムは、プログラムを制御できません。メモリを検索することでこのタスクを実行します。
この2番目のプログラムの書き方についてアドバイスが必要です。
パルシファルはそれを正しく持っています。。。
それはJNIがあなたの答えだと言った。JNIを使用すると、メモリを共有するすべてのロジックを処理するJavaでC実行可能ファイルを呼び出すことができます。その時点では、Cで記述されたスレッド間で通常のIPCを実行するだけです。
これは迅速で汚い(そしてデバッグするのが面倒)可能性がありますが、あまり問題なくデータをパラメーターとして渡すことができますが、マルチスレッドを実行する準備をしてください。
または、ActiveMQなどのJMS準拠のメッセージングエンジンを使用することもできます。データが利用可能になったときに、データをある種のメッセージにシリアル化すると、Javaはそれを聞いている人にブロードキャストできます。(1000クライアントの場合もあれば、0の場合もあります。Javaはそれを知る必要はありません)ただし、これには追加のセットアップが必要になります。少なくとも、AMQはそれを行うためにローカルにJettyサーバーをセットアップすると思います。
最後に(以下のコメントで示唆されているように)、データが十分に単純な場合は、いつでもスワップファイル(つまり、データを保持するための単純な古いファイル)を作成できます。データが利用可能になったら、データを書き出すだけです。現在書き込まれていない場合は、アクセス許可を持つ他のプロセスがアクセスできます。
あなたは本質的にデバッガーを書きたいと思っています。
Javaには、 JPDAと呼ばれる組み込みのデバッグ機能があります。ただし、通常、デバッグされるプロセスは、デバッガーを接続できるようにするオプションを使用して開始する必要があります。あなたがこれを行うことができれば、素晴らしい。
JMapプログラムは、実行中のプロセスにアタッチできます。あまり深く調べていませんが、SunToolsJARのクラスを介してデバッグエージェントをそのプロセスにロードする方法があるようです。もちろん、これはSun / Oracle JVM(またはOpenJDK)でのみ機能します。
3番目のオプションは、JVMの外に出て、gdbなどのツールを使用することです。このルートを取るには、JVMの実装を理解する必要があります。分散実行可能ファイルに残っているデバッグ情報の量はわかりませんが、ビルドに十分に慣れれば、エントリポイントを特定できる可能性があります。
もちろん、OSはアクセスルールを適用するため、ハッキングされるプロセスが別のユーザーとして実行されていて、スーパーユーザーでない場合は、運が悪いことになります。
編集:
私は、Java側がメモリアクセスを認識していなければならないことを見逃しました。その場合、JVMメモリのrawアドレスを取得する方法については、https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafeを参照してください。