問題タブ [tcmalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1340 参照

memory-leaks - tcmallocがスタックトレースを生成しない

tcmallocにリンクされたバイナリを実行していますが、検出しているリークのスタックトレースを生成していません。

pprofを実行すると、印刷するノードがないというメッセージが表示されます。

メモリリークが疑われるコードを同封しています

これをデバッグする方法について何かアイデアはありますか?

0 投票する
1 に答える
377 参照

c++ - このプラットフォームには実装されていない64ビットのNoBarrier_Store()

「64ビットのNoBarrier_Store()はこのプラットフォームに実装されていません」vs2005のwin7でtcmallocを使用しています。私のアプリには2つのスレッドがあります。1つはmalloc()を実行し、もう1つはfree()を実行します。tcmallocはアプリの起動時にこれを出力します。デバッグ後、次の関数が_WIN32で機能しないことがわかりました。

win32でこれを回避する方法を知りたいです。どうもありがとう。

0 投票する
2 に答える
5231 参照

c++ - 共有 DLL を使用する Windows 64 ビット アプリケーションに tcmalloc を統合できた人はいますか?

tcmalloc を統合しようとしている 64 ビットの Visual Studio 2010 (シングル スレッド) C++ Windows アプリケーションがあり、動的にリンクされた dll のいずれかを使用すると問題が発生します。tcmalloc をスタティック ライブラリとしてリンクしました。tcmalloc は、アプリケーションが共有 dll の 1 つを使用し始めるまではうまく機能します。ソリューションを 64 ビット DEBUG アプリケーションとして構築しました。CRT ライブラリの C/C++ デバッグ バージョン (MSVCP100D.dll および MVCR100D.dll) とのすべての dll のリンク。

以下は、失敗するコードの例です。すべてのメモリ割り当てに対して tcmalloc が呼び出されますが、delete が呼び出されると、アプリケーションがクラッシュします。メインの実行可能ファイルで関数を作成し、そこにコードをコピーすると、まったく同じコードが正常に機能するため、本当に不可解です。

このような状況で tcmalloc を使用した経験のある方がいらっしゃいましたら、フィードバックをいただければ幸いです。それは私には謎です。dllの(異なるヒープ??)のメモリモデルの問題ですか?知らない。彼らは同じヒープを使用しているようです。

この投稿が長すぎる場合は申し訳ありません。できるだけ多くの情報を提供しようとしました。

ありがとうございました。

ブルース

更新: テストとして、クラッシュしていた共有 dll を静的ライブラリに変更し、アプリケーションが別の dll を使用するまで、すべて正常に動作しました。そのため、何らかの理由で tcmalloc が共有 dll を処理するためにいくつかの追加手順が必要になります。tcmalloc を使用してメモリ プロファイリング用の dll の静的ライブラリをすべて作成できますが、共有 dll を tcmalloc で使用するには他に何をする必要があるかを知っておくとよいでしょう。

DLL ヘッダー ファイルのメソッド宣言: __declspec(dllexport) static std::string GetExecutablePath();

//.cpp の実装

一時文字列が破棄されたときに呼び出されるメソッド:

tcmalloc を共有 DLL として再構築した後、メモリを解放しようとすると別の場所でクラッシュするようになりました。

afxmem.cpp:

dbgheap.c:

0 投票する
0 に答える
766 参照

performance - メモリ プールの代わりに tcmalloc/jemalloc を使用する必要がありますか?

私のプロジェクトでは、メモリ プール (boost::pool) を使用していますが、あまりにも多くのメモリ (測定値 22G) を消費するため、tcmalloc/jemalloc を使用してメモリ プールを置き換えたいと考えています。

tcmalloc/jemalloc 置換プールを使用すると、使用されるメモリは少なくなりますが、パフォーマンスの問題が発生すると思います。どうすれば解決できますか?ありがとう!

0 投票する
2 に答える
4895 参照

c++ - tcmalloc の断片化

私たちのソフトウェアはアクター モデル システムを実装しており、小さなオブジェクトを頻繁に割り当て/割り当て解除しています。各オブジェクトがメモリ リークなしで破棄されると確信しています。(valgrind と tcmalloc ツールを使用して、ソフトウェアのメモリ リークをチェックしました。リークは見つかりませんでした。)

glibc で malloc を置き換えるために tcmalloc を使用するように変更すると、プロセスが OOM (メモリ不足) によって強制終了されるまでメモリが増加し続けることがわかりました。その後、glibc にも同じ問題があることがわかりましたが、増加率は tcmalloc よりも小さくなっています。

malloc_stats() を使用してメモリ情報を表示しました

最初の実行後 (トップ ショー 0.96G)'


  • MALLOC: 960110592 (915.6 MB) ヒープ サイズ
  • MALLOC: 15886016 (15.2 MB) アプリケーションで使用中のバイト
  • MALLOC: 907419648 (865.4 MB) ページ ヒープの空きバイト数
  • MALLOC: 0 (0.0 MB) ページ ヒープでマップされていないバイト
  • MALLOC: 27121208 (25.9 MB) 中央キャッシュの空きバイト数
  • MALLOC: 151040 (0.1 MB) 転送キャッシュの空きバイト数
  • MALLOC: 9532680 (9.1 MB) スレッド キャッシュの空きバイト数
  • MALLOC: 14275 スパン使用中
  • MALLOC: 27 個のスレッド ヒープが使用中
  • MALLOC: 7602176 (7.2 MB) 割り当てられたメタデータ

5回目の同じ実行後(トップショー1.2G)

  • MALLOC: 1173131264 (1118.8 MB) ヒープサイズ
  • MALLOC: 18001048 (17.2 MB) アプリケーションで使用中のバイト
  • MALLOC: 1082458112 (1032.3 MB) ページ ヒープの空きバイト数
  • MALLOC: 21168128 (20.2 MB) ページ ヒープでマップされていないバイト
  • MALLOC: 37992328 (36.2 MB) 中央キャッシュの空きバイト数
  • MALLOC: 252928 (0.2 MB) 転送キャッシュの空きバイト数
  • MALLOC: 13258720 (12.6 MB) スレッド キャッシュの空きバイト数
  • MALLOC: 17651 スパン使用中
  • MALLOC: 27 個のスレッド ヒープが使用中
  • MALLOC: 8126464 (7.8 MB) 割り当てられたメタデータ

このようなデータからわかります。5 回目の同じ動作の後、17.2 のみがソフトウェアで使用されます。ただし、tcmalloc は、システムに戻らずに 1.1G のメモリを保持します。もちろん、tcmalloc がそれらのメモリを保持するかどうかは問題ではありません。しかし、OOM によってプログラムが強制終了されると、増加し続けます (実際に使用されるメモリは 1G 未満です)。

ヒープの断片化に関連しているとは思えません。どなたか、私たちと共有できる経験をお持ちですか? https://bugzilla.redhat.com/show_bug.cgi?id=843478と同じ状況だと思い ます

どうもありがとう。

0 投票する
2 に答える
1433 参照

c++ - tcmalloc の予期しない動作

私は大規模なプロジェクトで数か月間 tcmalloc を使用してきましたが、これまでのところ、メモリ リークを追跡して削除できる HeapProfiling 機能に非常に満足していると言わざるを得ません。

ここ数週間、アプリケーションでランダムなクラッシュが発生しましたが、ランダムなクラッシュの原因を見つけることができませんでした。非常に特殊な状況で、アプリケーションがクラッシュしたときに、アプリケーション スレッドの 1 つのスタックが完全に破損していることに気付きました。代わりに、スレッドが tcmalloc::PageHeap::AllocLarge() でスタックしていることが何度かわかりましたが、tcmalloc のデバッグ シンボルがリンクされていないため、何が問題なのか理解できませんでした。

ほぼ 1 週間の調査の後、今日、最も単純なことを試してみました。リンケージから tcmalloc を削除して使用しないようにし、何が起こったのかを確認しました。ええと...私は最終的に問題が何であるかを発見しました.問題のコードは次のように見えます:

libc を使用してもアプリケーションはクラッシュしましたが、最終的に、スタックに割り当てられたオブジェクトに対して delete を呼び出していることがわかりました。

私がまだ理解できないのは、この非常に危険な (完全に間違っていない場合) オブジェクトの割り当て解除と、AllocatingFunction が終了したときに object_on_stack が範囲外になったときの二重の割り当て解除にもかかわらず、tcmalloc が代わりにアプリケーションを実行し続けた理由です。実際のところ、問題のコードは、根底にある忌まわしさのヒントなしに繰り返し呼び出される可能性があります。

メモリの割り当て解除が適切に使用されていない場合の「未定義の動作」の 1 つであることは知っていますが、「標準」の libc と tcmalloc では動作が大きく異なることに驚きました。

tcmalloc がアプリケーションを実行し続ける理由について、何らかの洞察の説明がある人はいますか?

前もって感謝します :)

ごきげんよう

0 投票する
1 に答える
2787 参照

c - カスタム メモリ プール マネージャーで tcmalloc/jemalloc を使用する

jemalloc/tcmallocのような高性能の汎用アロケータをメモリ プールとともに使用したいと考えています。これを行うためのガイドはありますか?のドロップイン代替としてjemalloc/を使用したくありません。tcmallocmalloc

libarena大きなメモリ領域 (2GB)を使用して分割するメモリ プールがあります。gsliceこのアリーナのように、たとえば 1 GB の固定サイズのオブジェクト プールを作成したいと考えています。(Bonwick スラブ アロケーターのように) 残りのメモリを可変サイズの汎用割り当てに使用したい場合。このメモリ領域を持っているjemalloc/使用したいです。tcmallocこれは可能ですか?どうすれば進められるかについてのアイデアはありますか?代替ライブラリがあれば、それについても聞きたいです。

0 投票する
0 に答える
784 参照

c++ - tcmalloc の MALLOCSTATS 出力の解釈

tcmalloc を使用するマルチスレッド アプリケーションのパフォーマンスの問題を修正しようとしています。各スレッドは多数のオブジェクトを作成し、私の分析では、tcmalloc のスレッド キャッシュがメモリを割り当てることができず、中央のページ ヒープからメモリを取得しようとすることがよくあります。 これは、 4 つのスレッドに対してMALLOCSTATS=2を使用した app の私の出力です。

255 大 * 15 スパン ~ 706.3 MiB; 713.5 MiB 精液; マッピングされていない: 0.0 MiB; 0.0 MiB 兼

これが、どのスレッドキャッシュが使い果たされているかを示しているかどうかはよくわかりません。枯渇するスレッド キャッシュの分析は、GDB で実行されているプログラムを観察し、futex システム コールを呼び出す tcmalloc コードを解釈することに基づいています。

更新また、スレッド数が増減してもスレッドごとのキャッシュが変化しないことに気付きました。成長するのはページヒープです。

0 投票する
1 に答える
5219 参照

c++ - tcmalloc ReleaseFreeMemory() がメモリを適切に解放しない

ヒープが非常に大量に拡大および縮小するアプリケーションの 1 つで tcmalloc を使用しています。明らかに、tcmalloc がメモリを OS に解放しないという問題に直面しました。今、私は api を使用してそれを実行しようとしましたMallocExtension::instance()->ReleaseFreeMemory();。正常に動作し、メモリを解放しました。しかし、しばらくの間 (たとえば 5 分) プロセスを実行し続けると、メモリはまだ初期レベル (場合によってはそれ以上) まで増加しています。奇妙なことに、アプリケーションはアイドル状態です。

これが私のコードです

どんな助けにも感謝します。