首先,我正在填充一个相当大且具有相互关系的结构。然后我将其序列化为二进制存档。该结构的大小取决于我向程序提供的数据。我看到该程序需要大约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
但是当有足够的掉期时,为什么会出现新的崩溃?为什么序列化过程需要这么多内存?
答案 0 :(得分:1)
问题:当交换为空时,为什么在分配内存时会崩溃?
分配的对象太大,无法容纳virtual address space:
中的任何位置如果您的应用程序符合32位标准,则流程virtual address space仅限于4Gb。
问题:为什么序列化过程占用了这么多RAM?
我没有找到任何证据。
答案 1 :(得分:1)
我意识到序列化过程需要额外的内存,因为它有自己的管家工作。这就是命中3GB Barrier
要停止序列化进程以获取额外的内存我禁用了对象跟踪BOOST_CLASS_TRACKING
并修复了额外的内存开销。