论坛首页 综合技术论坛

项目事故和安全语言

浏览 74465 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-09-26  

进程申请的堆空间,是无法释放的。只有栈空间才会释放。

查查 进程控制块 Process Control Block 吧。
里面的数据结构记录的信息很有限,无法做到自动追踪和记录这个进程申请的所有块。

引用

windows 下面 开个 cmd, 写个不释放 内存的cpp 程序,run 完已后,把这个dos 窗口关闭了,刚才不释放 内存的cpp 程序还会对os 有影响?


YES。有影响。这叫做内存泄漏。

0 请登录后投票
   发表时间:2006-09-26  
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?
0 请登录后投票
   发表时间:2006-09-26  
buaawhl 写道

进程申请的堆空间,是无法释放的。只有栈空间才会释放。

查查 进程控制块 Process Control Block 吧。
里面的数据结构记录的信息很有限,无法做到自动追踪和记录这个进程申请的所有块。

引用

windows 下面 开个 cmd, 写个不释放 内存的cpp 程序,run 完已后,把这个dos 窗口关闭了,刚才不释放 内存的cpp 程序还会对os 有影响?


YES。有影响。这叫做内存泄漏。



老大,虽然我没试过(兄弟我的机器上没有装C编译器),但是基本判断这里不会有内存泄露
现代的32位操作系统里面,每个进程都是单独的寻址空间.kill掉就挂了.
国内的很多操作系统教材,多数还停留在16位的年代吧
0 请登录后投票
   发表时间: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位的年代吧


每个进程分配一个单独的堆空间?如果不够呢?


0 请登录后投票
   发表时间:2006-09-26  
robbin 写道
完了,是不是因为Java太普及了,就没有人懂C了?

C指针引用越界,你怎么回收?


实话说 看到 robbin 这样回答 我真的不知道说什莫好?

在32位下,你指针能指到哪去? 还不是在你那个 4G 空间里面转悠 ?(算上 OS限制的部分,剩下的3G都不到), 进程都没有了, 还轮得到指针说话?

0 请登录后投票
   发表时间: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 也是一个进程。


每个进程分配一个单独的堆空间?如果不够呢?
----没有听明白, 能否具体说说?

0 请登录后投票
   发表时间:2006-09-26  

先给一个权威link吧。说明32位计算机的堆变量,会在进程退出的时候,能够自动释放。我还是第一次听到这样的新鲜事。

另外,内存越界是很正常的。从数据段越界到代码段都有可能。32位就没有这个问题了?我还以为32位就是提供了更大的寻址空间呢,没想到还有这个智能。
0 请登录后投票
   发表时间: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掉之后一点渣都留不下(操作系统帮程序清理).
如果是对内核堆操作,那就另说了,不过,我还没见到过俺们写应用程序的会用到内核堆
0 请登录后投票
   发表时间: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
判断完毕,是误操作.和系统无关.
0 请登录后投票
   发表时间: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级别的。没有啥好比较的。



0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics