まず、非常に大きく、相互関係のある構造を作成します。次に、それをバイナリアーカイブにシリアル化します。その構造のサイズは、プログラムにフィードするデータによって異なります。プログラムが期待され、受け入れられる構造を構築するために最大2GBのメモリを使用しているのがわかります。
次に、オブジェクトのシリアル化を開始します。シリアル化中にプログラムがRAMを消費しているのがわかります。RAM使用量は100%近くまで増加します。スワップ使用量はまだ0バイトです。
その後、アプリケーションがクラッシュします。オンを除いbad_alloc
てnew
シリアル化プロセスに多くのRAMと時間がかかるのはなぜですか?スワップが空のときにメモリの割り当て中にクラッシュするのはなぜですか?バックトレースが長すぎて完全に貼り付けることができません。
#0 0xb7fe1424 in __kernel_vsyscall ()
#1 0xb7c6e941 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2 0xb7c71e42 in abort () at abort.c:92
#3 0xb7e92055 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6
#4 0xb7e8ff35 in ?? () from /usr/lib/libstdc++.so.6
#5 0xb7e8ff72 in std::terminate() () from /usr/lib/libstdc++.so.6
#6 0xb7e900e1 in __cxa_throw () from /usr/lib/libstdc++.so.6
#7 0xb7e90677 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6
#8 0xb7f00a9f in boost::archive::detail::basic_oarchive_impl::save_pointer(boost::archive::detail::basic_oarchive&, void const*, boost::archive::detail::basic_pointer_oserializer const*) () from /usr/lib/libboost_serialization.so.1.42.0
#9 0xb7effb42 in boost::archive::detail::basic_oarchive::save_pointer(void const*, boost::archive::detail::basic_pointer_oserializer const*) () from /usr/lib/libboost_serialization.so.1.42.0
#10 0x082d052c in void boost::archive::detail::save_pointer_type<boost::archive::binary_oarchive>::non_polymorphic::save<gcl::NestedConnection<gcl::Section, gcl::NestedConnection<gcl::Paragraph, gcl::NestedConnection<gcl::Line, void> > > >(boost::archive::binary_oarchive&, gcl::NestedConnection<gcl::Section, gcl::NestedConnection<gcl::Paragraph, gcl::NestedConnection<gcl::Line, void> > >&) ()
#11 0x082d0472 in void boost::archive::detail::save_pointer_type<boost::archive::binary_oarchive>::save<gcl::NestedConnection<gcl::Section, gcl::NestedConnection<gcl::Paragraph, gcl::NestedConnection<gcl::Line, void> > > >(boost::archive::binary_oarchive&, gcl::NestedConnection<gcl::Section, gcl::NestedConnection<gcl::Paragraph, gcl::NestedConnection<gcl::Line, void> > > const&) ()
.......
#172 0x082a91d8 in boost::archive::detail::interface_oarchive<boost::archive::binary_oarchive>::operator<< <gcl::Collation const> (this=0xbfffe500, t=...) at /usr/include/boost/archive/detail/interface_oarchive.hpp:64
#173 0x082a6298 in boost::archive::detail::interface_oarchive<boost::archive::binary_oarchive>::operator&<gcl::Collation> (this=0xbfffe500, t=...) at /usr/include/boost/archive/detail/interface_oarchive.hpp:72
#174 0x0829bd63 in main (argc=4, argv=0xbffff3f4) at /home/neel/projects/app/main.cpp:93
- 小さいデータがプログラムに供給されると、プログラムは正しく機能します。
- Linux64ビットと32ビットPAEカーネルブースト1.42の使用
- プログラムは、数リビジョン前にクラッシュすることなく動作していました。最近、構造体にさらにバイトを追加しました。その場合、RAMの終わりに到達しておらず、現在は到達している可能性があります。
しかし、十分なスワップがあるのに、なぜ新しいクラッシュが発生するのでしょうか。なぜシリアル化プロセスはそれほど多くのRAMを必要とするのでしょうか?