0

Mac OS Xでこのjdbc-driverを使用してSQLiteデータベースにデータ(80kタプルで約15mb)を書き込むアプリケーションがあります。これはトランザクションを使用して実行され、最大のものには1つのテーブルに約45kの挿入が含まれます。アプリケーションをプロファイリングするとき、いくつかのことが奇妙に思えます。

  1. を使用して最初にアプリケーションを一時停止するSystem.in.read()と、プロセスによって割り当てられたメモリがゆっくりと増加し続けます。何故ですか?
  2. アプリケーションを実行すると、VisualVMモニターで使用されるヒープスペースは常に約80MBになります。ただし、メモリ使用量をプロファイリングすると、合計で約10MBになります。誰かがこの違いを説明できますか?

助けてくれてありがとう。

4

2 に答える 2

1

メモリ使用量のジグソー パターンは、RMI を介して送信されるプロファイリング結果によるものです。これは実際、プログラムによって実際のメモリ割り当てからフィルタリングするのは非常に混乱し、面倒です。これらをフィルタリングする方法については、「 VisualVM プロファイリングが結果を汚染している」を参照してください :-)

于 2012-01-10T12:44:24.820 に答える
0

最初の問題に関しては、タイム スライスのどのくらいの期間にわたってゆっくりとした成長が観察されましたか。Java プロセスでメモリ使用量が静止している場合、通常、鋸歯状のパターンが発生します。同じタイム スライスで GC が発生するのを見ましたか? そうでない場合、それはこの考えを支持するより多くの証拠です。

問題 2 については、詳細な情報がないと断言するのは非常に困難です。通常、プロファイリングをオンにすると、アプリケーションの動作が異なることが予想されます。これは、タイミング ウィンドウが変更されたり、アプリケーションがデータのレポート通常の作業に時間を費やさなければならないなどの理由によるものです。コードがインストルメント化され、これにより GC がトリガーされ、ヒープの使用量が減少します。プロファイリングがオフになっているときにアプリケーションで System.gc() を実行してみて、ヒープ使用量が報告された内容をお知らせください。

于 2010-05-11T16:37:53.637 に答える