- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在应用程序中使用 Boehm C++ 垃圾收集器。该应用程序使用 Levenshtein Deterministic Finite Automata Python 程序来计算两个字符串之间的 Levenshtein 距离。我已经使用 gcc 4.1.2 将 Python 程序移植到 Centos Linux 版本上的 C++。
最近,我注意到在运行应用程序超过 10 分钟后,我收到 SIGABRT 错误消息:堆部分太多:增加 MAXHINCR 或 MAX_HEAP_SECTS
。我想知道是否有人知道如何解决或解决这个问题。
这是我的 gdb 堆栈跟踪。谢谢。
Program received signal SIGABRT, Aborted.
(gdb) bt
#0 0x002ed402 in __kernel_vsyscall ()
#1 0x00b1bdf0 in raise () from /lib/libc.so.6
#2 0x00b1d701 in abort () from /lib/libc.so.6
#3 0x00e28db4 in GC_abort (msg=0xf36de0 "Too many heap sections: Increase MAXHINCR or MAX_HEAP_SECTS")
at ../Source/misc.c:1079
#4 0x00e249a0 in GC_add_to_heap (p=0xb7cb7000, bytes=65536) at ../Source/alloc.c:812
#5 0x00e24e45 in GC_expand_hp_inner (n=16) at ../Source/alloc.c:966
#6 0x00e24fc5 in GC_collect_or_expand (needed_blocks=1, ignore_off_page=0) at ../Source/alloc.c:1032
#7 0x00e2519a in GC_allocobj (sz=6, kind=1) at ../Source/alloc.c:1087
#8 0x00e31e90 in GC_generic_malloc_inner (lb=20, k=1) at ../Source/malloc.c:138
#9 0x00e31fde in GC_generic_malloc (lb=20, k=1) at ../Source/malloc.c:194
#10 0x00e322b8 in GC_malloc (lb=20) at ../Source/malloc.c:319
#11 0x00df5ab5 in gc::operator new (size=20) at ../Include/gc_cpp.h:275
#12 0x00de7cb7 in __automata_combined_test2__::DFA::levenshtein_automata (this=0xb7b49080, term=0xb7cb5d20, k=1)
at ../Source/automata_combined_test2.cpp:199
#13 0x00e3a085 in cDedupe::AccurateNearCompare (this=0x8052cd8,
Str1_=0x81f1a1d "GEMMA OSTRANDER GEM 10
DICARLO", ' ' <repeats 13 times>, "01748SUE WOLFE SUE 268 POND", ' ' <repeats 16 times>,
"01748REGINA SHAKIN REGI16 JAMIE", ' ' <repeats 15 times>, "01748KATHLEEN MAZUR CATH10 JAMIE "
...,
Str2_=0x81f2917 "LINDA ROBISON LIN 53 CHESTNUT", ' ' <repeats 12 times>,
"01748MICHELLE LITAVIS MICH15 BLUEBERRY", ' ' <repeats 11 times>, "01748JOAN TITUS JO 6 SMITH",
' ' <repeats 15 times>, "01748MELINDA MCDOWELL MEL 24 SMITH "..., Size_=10,
更新:
我查看了 Boehm Garbage Collector 源文件和头文件并意识到:Too many heap sections: Increase MAXHINCR or MAX_HEAP_SECTS
错误消息可以通过将 ‑DLARGE_CONFIG 添加到我的 GNUmakefile 中的 CFLAGS 部分来修复.
我测试了对我的 GNUmakfile 的更改,发现 Too many heap sections: Increase MAXHINCR or MAX_HEAP_SECTS
错误消息不再出现。但是我收到了一个新的段错误(核心转储)。使用gdb我发现GDB段错误发生在第20行的以下函数中(我已注释):
set<tuple2<__ss_int, __ss_int> *> *NFA::next_state(set<tuple2<__ss_int, __ss_int> *> *states, str *input) {
tuple2<__ss_int, __ss_int> *state;
set<tuple2<__ss_int, __ss_int> *>::for_in_loop __3;
set<tuple2<__ss_int, __ss_int> *> *__0, *dest_states;
dict<str *, set<tuple2<__ss_int, __ss_int> *> *> *state_transitions;
__iter<tuple2<__ss_int, __ss_int> *> *__1;
__ss_int __2;
dest_states = (new set<tuple2<__ss_int, __ss_int> *>());
FOR_IN_NEW(state,states,0,2,3)
state_transitions = (this->transitions)->get(state, ((dict<str *, set<tuple2<__ss_int, __ss_int> *> *> *)((new dict<void *, void *>()))));
dest_states->update(state_transitions->get(input, new set<tuple2<__ss_int, __ss_int> *>()));
dest_states->update(state_transitions->get(NFA::ANY, new set<tuple2<__ss_int, __ss_int> *>()));
END_FOR
return (new set<tuple2<__ss_int, __ss_int> *>(this->_expand(dest_states),1));//line20
}
我想知道是否可以修改这个函数来修复段错误。谢谢。
最佳答案
我终于想出了解决 GC 内存不足段错误的方法。我替换了 python 程序中的 setdefault 和 get 构造。例如,我将 self.transitions.setdefault(src, {}).setdefault(input, set()).add(dest) python 语句替换为:
if src not in self.transitions:
self.transitions[src] = {}
result = self.transitions[src]
if input not in result:
result[input] = set()
result[input].add(dest)
此外,我替换了 python 语句:
new_states = self.transitions.get(state, {}).get(NFA.EPSILON, set()).difference(states)
与:
if state not in self.transitions:
self.transitions[state] = {}
result = self.transitions[state]
if NFA.EPSILON not in result:
result[NFA.EPSILON] = set()
cook = result[NFA.EPSILON]
new_states = cook.difference(states)
最后,我确保将 __shedkin__.init()
放在 for 或 while 循环之外。 __shedskin__.init()
调用 GC 分配器。所有这些更改的目的都是为了减轻 GC 分配器的压力。
我已经通过对 GC 分配器的 300 万次调用测试了这些更改,但我还没有遇到段错误。谢谢。
关于c++ - Boehm GC++ 垃圾收集器 : Too many heap sections Increase MAXHINCR or MAX_HEAP_SECTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4728537/
我在 Mono 的网页上看到他们在精确模式下使用 Boehm GC。我也将 Boehm GC 与 C++ 一起使用,但是,我在其文档或 header 中找不到任何指示精确模式的内容,更不用说如何打开它
我检查了 Boehm GC。 C/C++ 的 GC。 我知道标记清除算法。我很好奇的是它如何在整个 C 内存中只获取指针。我对C内存的理解只是一个普通的字节数组。是否可以确定内存中的值是否为指针? 最
我很好奇有没有大型项目使用过Boehm GC?我特别感兴趣的是是否有任何游戏项目使用了这个垃圾收集器。如果不是,Boehm GC 是否对游戏项目不利? 令我印象深刻的是像这个 Boehm GC 这样的
标记指针是实现动态语言时常见的优化:利用对齐要求,这意味着指针的低两位或三位将始终为零,并使用它们来存储类型信息。 假设您正在使用 Boehm 垃圾收集器,它的工作原理基本上是查看事件数据以查找看起来
我正在阅读论文“不合作环境中的垃圾收集器”,想知道实现它会有多困难。该论文描述了需要从处理器收集所有地址(除了堆栈)。堆栈部分看起来很直观。除了在汇编中显式枚举每个寄存器之外,还有什么方法可以从寄存器
我读过 article in LinuxJournal关于Boehm-Demers-Weiser garbage collector library .我很感兴趣在我的库中使用它而不是我自己的引用计数
我正在尝试写一些 bindings到用于 Rust 的 Boehm GC。 一些背景:Rust 被设计成一种高并发语言,这种设计的结果是能够将 GC 指针静态限制在分配它们的线程内(即,分配在线程 x
我想在 Linux/AMD64/Debian 上使用 GCC 开发一个多线程 C++ 应用程序(最终大部分 C++ 代码将由应用程序本身生成,这可以被视为一种高级领域特定语言) 4.6(可能是最新的
在我的 on-again-off-again 编译器项目中,我将闭包实现为具有可执行前缀的分配内存。所以一个闭包是这样分配的: c = make_closure(code_ptr, env_size,
我有 2 个关于 boehm-gc 的问题。 GC 回收垃圾对象时,即使对象有析构函数,GC 也会释放内存而不调用析构函数。我发现 GC 调用“finailzer”,但我不知道如何注册它...我该怎么
我有一个使用 Boehm GC 实现的个人项目。我需要实现一种事件类型,它应该包含对其他事件的引用。但我还需要确保指向的事件仍然是可收集的,因此我需要弱引用。 假设我们有事件 A、B 和 C。我将这些
我现在正在学习 boehm gc c++ 接口(interface)。不使用它,只是好奇。我按照官方的例子,写我的类什么可以被 GC,在析构函数中,有一个输出,所以我可以判断一个实例是否被 GC。但只
我在 Android x86 上的 Boehm 中遇到奇怪的崩溃(但 arm 工作正常);它正在崩溃: deferred = *(word *)limit; 与: LogCat: I/DEBUG (
我在以下环境中开发了一个应用程序(在我的错误中重命名为 MyApplication 以保护隐私): 单点触控 2.1 MonoDevelop 2.4.2 MacOS 10.6.8 iOS SDK 4.
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
Boost.Coroutine 分配自己的调用堆栈。 Boehm GC 是否将这些堆栈上的指针视为根,如果不是,我如何才能做到这一点?在上下文切换到协程后,Boehm 终止程序。 最佳答案 推测 Bo
我已经开始在我正在制作的库中使用引用计数。这是一个相当不错的解决方案,递增和递减不会像某些人错误地认为的那样浪费很多资源。此外,用于引用计数的少量额外内存可以忽略不计。 但显然跟踪垃圾收集非常好,它比
据我所知,asprintf 调用 malloc。如果我用 Boehm GC 替换 malloc,对 asprintf 的调用仍然调用传统的 malloc - 至少 valgrind 是这样告诉我的:
这段代码导致了我的内存泄漏,我不确定为什么。 [编辑] 包含来自 here 的代码质疑: #include "src/base.cpp" typedef std::map, gc_allocato
我有一个使用 Boehm GC 的项目,所以我想我可能会使用它自带的 cord 字符串库。问题是我对 cord 函数的所有调用都会导致“ undefined reference ”错误。 我在 /us
我是一名优秀的程序员,十分优秀!