锁定老帖子 主题:项目事故和安全语言
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-26
进程申请的堆空间,是无法释放的。只有栈空间才会释放。 查查 进程控制块 Process Control Block 吧。 里面的数据结构记录的信息很有限,无法做到自动追踪和记录这个进程申请的所有块。 引用 windows 下面 开个 cmd, 写个不释放 内存的cpp 程序,run 完已后,把这个dos 窗口关闭了,刚才不释放 内存的cpp 程序还会对os 有影响? YES。有影响。这叫做内存泄漏。 |
|
返回顶楼 | |
发表时间:2006-09-26
完了,是不是因为Java太普及了,就没有人懂C了?
C指针引用越界,你怎么回收? |
|
返回顶楼 | |
发表时间:2006-09-26
buaawhl 写道 进程申请的堆空间,是无法释放的。只有栈空间才会释放。 查查 进程控制块 Process Control Block 吧。 里面的数据结构记录的信息很有限,无法做到自动追踪和记录这个进程申请的所有块。 引用 windows 下面 开个 cmd, 写个不释放 内存的cpp 程序,run 完已后,把这个dos 窗口关闭了,刚才不释放 内存的cpp 程序还会对os 有影响? YES。有影响。这叫做内存泄漏。 老大,虽然我没试过(兄弟我的机器上没有装C编译器),但是基本判断这里不会有内存泄露 现代的32位操作系统里面,每个进程都是单独的寻址空间.kill掉就挂了. 国内的很多操作系统教材,多数还停留在16位的年代吧 |
|
返回顶楼 | |
发表时间:2006-09-26
charon 写道 buaawhl 写道 忍不住了.
难道现在的学校都不教 C 语言了? 如果进程申请的堆空间,能够自动释放,java的GC还有什么可吹嘘的呢? GC = Gabage Collection。 Java等vm语言为了做到GC,还是做了很多工作的。直接影响了语言的运行效率。是一个巨大的牺牲。 老大,GC的内存释放是动态的,程序照样在跑,而进程退出时的内存释放则是另外一回事情,要释放内存必须频繁启动/关闭程序,这个就比较e了。 进入真正的多进程操作系统时代之后,杀掉进程,这个进程相关的所有资源都会被干掉(当然对于fork出来的子进程某些情况下会有麻烦,但是子进程本身也是可以被kill掉的).系统资源被占用的原因多数是存在大量僵尸进程或孤儿进程. GC的含义包括动态内存释放。同样包括整个VM的memory的管理,都可以理解为这样。一个VM申请了一个巨大的栈空间,所有的堆内存都从这个里面获取,跑不出进程控制的范围。当然,实际原理不是这样,而是一个复杂的追踪纪录过程。pointer reference counting。 至于说这个进程关闭,资源就会全部释放掉。看你说的是什么资源,如果是数据库,文件,自然会释放,如果是申请的系统堆内存,怎么会释放?这不是成了个GC吗? 不知道charon老大是否用过c。 不过,我对charon的动态语言功底是比较佩服的。 :D 有空加MSN聊聊Python。 charon 写道 老大,虽然我没试过(兄弟我的机器上没有装C编译器),但是基本判断这里不会有内存泄露 现代的32位操作系统里面,每个进程都是单独的寻址空间.kill掉就挂了. 国内的很多操作系统教材,多数还停留在16位的年代吧 每个进程分配一个单独的堆空间?如果不够呢? |
|
返回顶楼 | |
发表时间:2006-09-26
robbin 写道 完了,是不是因为Java太普及了,就没有人懂C了?
C指针引用越界,你怎么回收? 实话说 看到 robbin 这样回答 我真的不知道说什莫好? 在32位下,你指针能指到哪去? 还不是在你那个 4G 空间里面转悠 ?(算上 OS限制的部分,剩下的3G都不到), 进程都没有了, 还轮得到指针说话? |
|
返回顶楼 | |
发表时间:2006-09-26
buaawhl 写道 charon 写道 buaawhl 写道 忍不住了.
难道现在的学校都不教 C 语言了? 如果进程申请的堆空间,能够自动释放,java的GC还有什么可吹嘘的呢? GC = Gabage Collection。 Java等vm语言为了做到GC,还是做了很多工作的。直接影响了语言的运行效率。是一个巨大的牺牲。 老大,GC的内存释放是动态的,程序照样在跑,而进程退出时的内存释放则是另外一回事情,要释放内存必须频繁启动/关闭程序,这个就比较e了。 进入真正的多进程操作系统时代之后,杀掉进程,这个进程相关的所有资源都会被干掉(当然对于fork出来的子进程某些情况下会有麻烦,但是子进程本身也是可以被kill掉的).系统资源被占用的原因多数是存在大量僵尸进程或孤儿进程. GC的含义包括动态内存释放。同样包括整个VM的memory的管理,都可以理解为这样。一个VM申请了一个巨大的栈空间,所有的堆内存都从这个里面获取,跑不出进程控制的范围。当然,实际原理不是这样,而是一个复杂的追踪纪录过程。pointer reference counting。 至于说这个进程关闭,资源就会全部释放掉。看你说的是什么资源,如果是数据库,文件,自然会释放,如果是申请的系统堆内存,怎么会释放?这不是成了个GC吗? 不知道charon老大是否用过c。 不过,我对charon的动态语言功底是比较佩服的。 :D 有空加MSN聊聊Python。 charon 写道 老大,虽然我没试过(兄弟我的机器上没有装C编译器),但是基本判断这里不会有内存泄露 现代的32位操作系统里面,每个进程都是单独的寻址空间.kill掉就挂了. 国内的很多操作系统教材,多数还停留在16位的年代吧 每个进程分配一个单独的堆空间?如果不够呢? 你启动一个的那个jvm 也是一个进程。 每个进程分配一个单独的堆空间?如果不够呢? ----没有听明白, 能否具体说说? |
|
返回顶楼 | |
发表时间:2006-09-26
先给一个权威link吧。说明32位计算机的堆变量,会在进程退出的时候,能够自动释放。我还是第一次听到这样的新鲜事。 另外,内存越界是很正常的。从数据段越界到代码段都有可能。32位就没有这个问题了?我还以为32位就是提供了更大的寻址空间呢,没想到还有这个智能。 |
|
返回顶楼 | |
发表时间:2006-09-26
给个链接:
http://www.chinavideo.org/index.php?option=com_content&task=view&id=291&Itemid=5 不过不是权威的.hehe 估计布老大和兄弟我一样都是古董年代过来的吧 兄弟我10年前开始用c/c++写程序,5年前就洗手不干了. 32位操作系统进程空间都是相对独立的.如果是在进程堆里面分配的东西,进程kill掉之后一点渣都留不下(操作系统帮程序清理). 如果是对内核堆操作,那就另说了,不过,我还没见到过俺们写应用程序的会用到内核堆 |
|
返回顶楼 | |
发表时间:2006-09-26
charon 写道 给个链接:
http://www.chinavideo.org/index.php?option=com_content&task=view&id=291&Itemid=5 不过不是权威的.hehe 估计布老大和兄弟我一样都是古董年代过来的吧 兄弟我10年前开始用c/c++写程序,5年前就洗手不干了. 32位操作系统进程空间都是相对独立的.如果是在进程堆里面分配的东西,进程kill掉之后一点渣都留不下(操作系统帮程序清理). 如果是对内核堆操作,那就另说了,不过,我还没见到过俺们写应用程序的会用到内核堆 谁能把这个删掉? 刚才改了一下上面的跟贴,居然出来一个新的引用贴,不知道是我的误操作还是系统的bug 判断完毕,是误操作.和系统无关. |
|
返回顶楼 | |
发表时间:2006-09-26
疯掉 成了讨论gc 和进程内存的贴了。
好吧 说说我的win32 进程知识 win32下面内核对象 包括以下 Access token Change notification Communications device Console input Console screen buffer Desktop Event Event log File File mapping Heap <------------- 大家的针对地方 Job Mailslot Module Mutex Pipe Process Semaphore Socket Thread Timer Timer queue Timer-queue timer Update resource Window station 这些object由OS管理,不同的OS能够同时打开,创建的object数目有限。由user level的程序创建和使用。 如果某个程序只开,不关闭。那么这些object只会越来越少,最后就不能用了,于是程序也就是不能跑了。 当然还有User Object 和GDI object也是差不多的道理,但是情况不是太严重而已 Heap,同样的,如果专门用操作heap的api去操作,来个故意泄漏。哪其他的程序也会出大麻烦了。 在win32中,malloc也是用heap,不过有跟踪过程。就是说进程只要不是异常被关闭,内存就会被释放。这里的异常,是指不是OS来控制的关闭动作(这个很难)。 以上 和C无关,主要看OS和malloc的最后实现如何 GC 就我的理解是在某个进程中,能够自动识别无用内存块,加以回收。是进程级别的。 进程的内存回收则是OS级别的。没有啥好比较的。 |
|
返回顶楼 | |