V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qsnow6
V2EX  ›  Python

Python 的内存泄露,内存直接爆炸

  •  
  •   qsnow6 · 2017-02-09 17:32:19 +08:00 · 7843 次点击
    这是一个创建于 2835 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ````
    import time
    b_time = bytes(int(time.time()))
    print(b_time)
    ````

    ubuntu 16.04 64bit下,一运行,内存直接爆炸
    第 1 条附言  ·  2017-02-10 00:26:43 +08:00
    不好意思哈,各位,刚入门,敲代码的时候发现这么个有意思的;)
    53 条回复    2017-02-16 23:02:09 +08:00
    abc950309
        1
    abc950309  
       2017-02-09 17:53:43 +08:00
    刚刚重启完电脑,表示不作死就不会死…………
    这是什么原理啊…………
    sleshep
        2
    sleshep  
       2017-02-09 17:57:42 +08:00   ❤️ 2
    bytes 输入数字表示创建一个长度为此数字的缓冲区,
    当前时间戳很大,所以缓冲区很大,不就内存溢出了,
    那不叫泄露,不要乱写标题
    binux
        3
    binux  
       2017-02-09 18:03:19 +08:00   ❤️ 2
    python3 的 bytes(n) 的意思是,创建一个 size 为 n 的对象
    karlakte
        4
    karlakte  
       2017-02-09 18:07:15 +08:00   ❤️ 2
    这就嘬死 不叫泄漏
    phrack
        5
    phrack  
       2017-02-09 18:11:16 +08:00 via Android
    申请太多内存了。

    也遇到过,感兴趣的是,为什么没有一个机制强行停止这个操作,当时一执行直接爆炸,按啥都没卵用。
    BruceAuyeung
        6
    BruceAuyeung  
       2017-02-09 18:24:51 +08:00 via Android
    @phrack ulimit
    aprikyblue
        7
    aprikyblue  
       2017-02-09 18:26:29 +08:00
    你先查查啥叫内存泄漏
    Mirana
        8
    Mirana  
       2017-02-09 18:56:14 +08:00
    oom?
    ericbize
        9
    ericbize  
       2017-02-09 18:57:41 +08:00
    <a href="http://imgur.com/dXfWmDp"><img src="" title="source: imgur.com" /></a>


    内存:我的内心毫无波动
    yanchao7511461
        10
    yanchao7511461  
       2017-02-09 18:58:45 +08:00
    应该是内存耗完,不是泄漏
    ericbize
        11
    ericbize  
       2017-02-09 19:00:07 +08:00
    楼主,要 python 3 吗 ?
    longaiwp
        12
    longaiwp  
       2017-02-09 19:18:14 +08:00
    这是个鬼泄露啊,这明显是申请过多好嘛
    est
        13
    est  
       2017-02-09 19:26:48 +08:00
    1. 你 bytes() 姿势不对
    2. 有不爆炸的内存泄露吗?
    a87150
        14
    a87150  
       2017-02-09 19:37:37 +08:00
    我还以为是什么 bug ,原来是自己作死
    wxjeacen
        15
    wxjeacen  
       2017-02-09 20:04:18 +08:00
    确实是自己作死。
    weyou
        16
    weyou  
       2017-02-09 21:05:33 +08:00 via Android
    没炸伤就好~
    kn007
        17
    kn007  
       2017-02-09 21:09:22 +08:00
    作死溢出。。
    lhbc
        18
    lhbc  
       2017-02-09 21:15:43 +08:00   ❤️ 1
    楼主你穿越回 1970 年 1 月 1 号就没有这个 bug 了
    neurocomputing
        19
    neurocomputing  
       2017-02-09 21:23:14 +08:00
    是啊,这不叫泄露,这叫作死
    napsterwu
        20
    napsterwu  
       2017-02-09 21:33:40 +08:00
    也就 1.5 个 G ?其实还好吧
    j5shi
        21
    j5shi  
       2017-02-09 21:34:58 +08:00 via iPhone
    现在有太多没有计算机背景的“程序员”,对计算机底层一窍不通,并对发明轮子乐此不疲。
    JRight
        22
    JRight  
       2017-02-09 21:36:17 +08:00
    楼主不要太受打击哈,慢慢进步~
    F0nebula
        23
    F0nebula  
       2017-02-09 23:17:20 +08:00
    @abc950309 看完你的回复后在虚拟机试了下 然后 boom~~~
    @ericbize 你试试 py3 我虚拟机 14128MiB 直接爆炸 我不会告诉你我刚刚冷重启的
    wohenyingyu02
        24
    wohenyingyu02  
       2017-02-10 00:00:09 +08:00 via iPhone
    @j5shi 我学计算机的同学都没有当程序员……
    sl0000
        25
    sl0000  
       2017-02-10 00:27:20 +08:00
    @j5shi 怎样才是有计算机背景的"程序员"?
    enenaaa
        26
    enenaaa  
       2017-02-10 09:36:36 +08:00
    win7 4G 内存,只是内存耗尽卡顿一段时间。
    这样看来还是 windows 稳啊
    Citrus
        27
    Citrus  
       2017-02-10 09:55:56 +08:00
    If it is an integer, the array will have that size and will be initialized with null bytes.

    所以也就是 1486656000 bytes 差不多 1.384556293 GB ,不会炸啊=。=
    j5shi
        28
    j5shi  
       2017-02-10 10:27:19 +08:00 via iPhone
    @wohenyingyu02 不懂你在说什么,我可没说学计算机的都要去当程序员。
    j5shi
        29
    j5shi  
       2017-02-10 10:29:22 +08:00 via iPhone
    @sl0000 比如不懂 C (或者 Clang 的)的就可以称为“没有计算机背景”。异或可以这么理解,能把这个称为“内存泄露”的,就是没有计算机背景。
    wohenyingyu02
        30
    wohenyingyu02  
       2017-02-10 10:33:12 +08:00
    @j5shi 学计算机的都不去当程序员,自然只能没有背景的当。我就是你说的那种“程序员”,我学会计法律的,但是我比我认识的大多数学计算机的同学都混得好,可能是因为我学校烂吧。
    xvx
        31
    xvx  
       2017-02-10 10:36:09 +08:00 via iPhone
    这叫内存泄漏……
    ericbize
        32
    ericbize  
       2017-02-10 10:46:03 +08:00
    @F0nebula python 3.5 一直在跑没死机 (我的不是虚拟机)

    <a href="http://imgur.com/B04dVyO"><img src="" title="source: imgur.com" /></a>

    <a href="http://imgur.com/a2pgZV8"><img src="" title="source: imgur.com" /></a>


    没事啊,就是不知道要跑到什么时候

    楼主,有升级内存的理由了 。
    ericbize
        33
    ericbize  
       2017-02-10 10:51:35 +08:00
    还能跑完

    <a href="http://imgur.com/0nwaf6h"><img src="" title="source: imgur.com" /></a>
    treo
        34
    treo  
       2017-02-10 10:52:20 +08:00
    100 年后、 1000 年后的计算机碰到这种场景还会卡顿吗
    换句话说,计算机性能的增长能赶上 timestamp 的增长速度吗
    j5shi
        35
    j5shi  
       2017-02-10 10:52:54 +08:00 via iPhone
    @wohenyingyu02 我可没说计算机背景指的是
    需要 CS 相关教育经历,你缺的是自信。
    freestyle
        36
    freestyle  
       2017-02-10 10:58:06 +08:00
    @ericbize 你的 Ubuntu 是日常使用机器码?中文输入在 IDE sublime 上有没有问题
    chez
        37
    chez  
       2017-02-10 11:10:46 +08:00
    Traceback (most recent call last):
    File "<pyshell#5>", line 1, in <module>
    print(b_time)
    MemoryError

    python3.6 就报个内存错误
    ryd994
        38
    ryd994  
       2017-02-10 11:12:56 +08:00
    难道我用的是假 Python ?还是说我用的假 Linux ? Fedora 说这锅 Python 不背


    @treo 你想多了,早就根本不虚了。因为有黑科技叫 overcommit 。 kernel 早就看穿了你们分配了这么多内存一定用不完
    nilai
        39
    nilai  
       2017-02-10 14:11:30 +08:00
    python3 测试有效。
    F0nebula
        40
    F0nebula  
       2017-02-10 14:12:40 +08:00
    @ericbize 好吧 我真机试了下 无压力 不过虚拟机刚开始能看到内存狂飙 然后大概是打印时系统挂了
    lostsquirrelX
        41
    lostsquirrelX  
       2017-02-10 14:35:50 +08:00
    应该是死在 print 上面
    Felldeadbird
        42
    Felldeadbird  
       2017-02-10 14:56:32 +08:00
    有意思!弄成恶作剧发给同事、
    hezhile
        43
    hezhile  
       2017-02-10 15:06:25 +08:00
    Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> import time
    >>> b_time = bytes(int(time.time()))
    >>> print(b_time)
    Traceback (most recent call last):
    File "<pyshell#2>", line 1, in <module>
    print(b_time)
    File "C:\Users\gilot\AppData\Local\Programs\Python\Python35\lib\idlelib\PyShell.py", line 1343, in write
    return self.shell.write(s, self.tags)
    OverflowError: cannot serialize a string larger than 4GiB
    >>>

    在 process explorer 里面, pythonw.exe 的 private bytes 确实飙升到了 7.3G (我的电脑内存只有 8G )
    操作系统是 win10 pro ,有大概 10 秒钟的时间整个系统没有反应
    wuruxu
        44
    wuruxu  
       2017-02-10 15:23:00 +08:00
    怎么爆炸了,一点反应也没有
    ```
    xyz@debian:~$ python
    Python 2.7.9 (default, Jun 29 2016, 13:08:31)
    [GCC 4.9.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import time
    >>> b_time = bytes(int(time.time()))
    >>> print(b_time)
    1486711277
    >>> ls
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'ls' is not defined
    >>>
    xyz@debian:~$

    ```
    kkk330
        45
    kkk330  
       2017-02-10 15:50:36 +08:00 via iPhone
    就像 38 楼说的,我也记得 Linux 下内存或者硬盘空间都可以申请超过实际大小(并不会真的分配给你,感觉炸了说不通啊
    langjiyuan
        46
    langjiyuan  
       2017-02-10 20:49:51 +08:00
    已 get 可以忽悠 有些自大的舍友去调试了
    zhjits
        47
    zhjits  
       2017-02-11 14:03:12 +08:00
    http://imgur.com/a/r14mh
    这个内存泄漏可能是真的……
    zhjits
        48
    zhjits  
       2017-02-11 14:05:01 +08:00

    目前内存占用似乎到顶了, print 执行过程中一直保持这个值
    zhjits
        49
    zhjits  
       2017-02-11 14:10:34 +08:00

    print 完内存占用就回去了,没泄露,只是 print 的 format 过程占用内存稍微大了一点而已
    q397064399
        50
    q397064399  
       2017-02-11 21:45:56 +08:00
    内存泄露是指程序申请的堆内存没有被正常回收导致内存泄露
    Khlieb
        51
    Khlieb  
       2017-02-12 08:50:35 +08:00 via Android
    熊叔: boom
    cxbats
        52
    cxbats  
       2017-02-12 11:32:10 +08:00 via Android
    这也叫泄漏?那 malloc(1000000000) 是不是也叫内存泄漏
    ericbize
        53
    ericbize  
       2017-02-16 23:02:09 +08:00
    @freestyle 不是日常使用,只是偶尔开开,那个输入中文的话还好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5125 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:51 · PVG 11:51 · LAX 19:51 · JFK 22:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.