如何在Python中导致堆栈溢出和堆溢出
我想了解python如何管理堆栈和堆。 所以我想做一些“不好”的编程,导致堆栈溢出和堆溢出。 我不明白的是为什么字符串例如在所有其他堆栈堆叠时堆叠起来。 这只是设计师的协议吗? 这些例子是否正确? 从我读过的所有东西都是在python中生成的,因为它的面向对象,对吧?
编辑 :我想像C这样的语言堆栈有一个固定的长度,但在python中,即使堆栈是动态分配的,正如Anycorn在他的回答中所说的。 这就是为什么我也得到完整的内存,如果我尝试一个大字符串(在堆栈上)或列表(在堆上)。 如果我错了,请纠正我。 谢谢
从http://docs.python.org/c-api/memory.html
Python中的内存管理涉及一个包含所有Python对象和数据结构的私有堆。 Python内存管理器在内部确保对这个私有堆的管理。 Python内存管理器具有不同的组件,可处理各种动态存储管理方面的问题,如共享,分割,预分配或缓存。
在最低级别,原始内存分配器确保私有堆中有足够的空间通过与操作系统的内存管理器交互来存储所有与Python相关的数据。 在原始内存分配器之上,几个对象特定的分配器在相同的堆上运行,并实现适用于每种对象类型特性的不同的内存管理策略。
这里有些例子。 你可以将它们复制粘贴到Python官方可视化器中,但是值较小会导致它无法运行...
对于堆栈溢出:
import time
word = "test "
x = word*1000000000
time.sleep(10)
print ("this message wont appear if stack overflow has occurred!")
我明白了
x = word*1000000000
MemoryError
如果我删除一个零它运行。 当我使用x = word*500000000
时,我获得了最大的内存使用量所以我不能进行堆栈溢出,因为即使堆栈是动态分配的?
对于堆溢出:
i = 10000
test_list = [0]
while i > 0 :
test_list [:0] = test_list #insert a copy of itself at the beginning
i -= 1
现在我不明白的是垃圾收集器如何在程序中启用。它是否在堆栈和堆上运行,因为它们都是动态分配的? 是否由于O / S内存管理器? 这些事情告诉我们关于python编程语言的特征是什么? 这是否证明术语“动态语言”或“解释”? 很抱歉,这个问题很长,但我只需要澄清一些事情。 提前致谢!
EDITED
我找到了我在找的东西:如果你调用sys.setrecursionlimit(N)
的值大于你的系统实际可以处理的值,然后尝试缓冲到这个深度,那么你可能会导致'真正的'堆栈溢出。 在某些时候,你的系统将会耗尽堆栈空间,Python解释器会崩溃。
通过构建一个无限循环的函数,你可以很容易地在python中引发堆栈溢出,就像其他语言一样。 这在Python中更容易,因为除了递归之外,它实际上不需要做任何事情。
>>> def foo():
... return foo()
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
.......
File "<stdin>", line 2, in foo
RuntimeError: maximum recursion depth exceeded
>>>
至于堆,这是由垃圾收集器管理的。 你可以分配很多对象,并最终用完堆空间,Python会引发一个MemoryError
,但这需要花费相当长的时间。 你在问题中用你的'堆栈溢出'的例子实际上做到了这一点。 您在堆栈中存储了对字符串的引用,该字符串占用了该进程可用的所有可用内存。 作为一个经验法则,Python在堆栈中存储对堆结构的引用,以获得它无法保证其大小的任何值。
至于它是如何工作的,从第一个例子可以看出,python对调用堆栈的深度有一个内置的限制,它不会超过它。 可用于堆空间的内存量由操作系统定义,并取决于许多因素。
这些应该是python文档中关于错误本身的信息的适当部分:
如果错误请纠正我的错误:
据我所知,当涉及到实际的堆栈实现时,python堆栈(在默认分配中)实际上是基于堆内存(使用malloc
分配的malloc
)。 所以你不能导致堆栈溢出,但可能会导致内存不足。 你看到的计算机放缓是因为内存正在交换到磁盘,非常缓慢的过程。
一般来说,您不知道解释/字节编译语言如何实现其堆栈,但大多数情况下它并未在堆栈内存中实现,因此不会导致堆栈溢出。 有可能使用alloca
来实现Python,但是为什么?
参看 CPython - 内部是什么存储在堆栈和堆上?
尝试使用汇编语言,C ++,Fortran等编译为机器码的相同实验。
链接地址: http://www.djcxy.com/p/14119.html上一篇: How to cause stack overflow and heap overflow in python
下一篇: Speed comparison with Project Euler: C vs Python vs Erlang vs Haskell