有没有比较C C++ JAVA OBJECTIVE C 的垃圾回收机制的文章?嵌入式C语言的堆栈管理如何实现
c++借助boost库①样可以实现自动回收算法,但这个回收和ARC是不①样的,比ARC要低级点,比手动管理内存要高级。
java你根本感觉不到内存管理,除非经常出现内存不够用,或创建大量对象时,这时需要更改java虚拟机的内存配置或更改程序或加内存条。
objc借助ARC(从微软的com组件引用计数借签过来的),感觉很方便,但创建大量对象时和jvm①样需要注意内存释放问题。
The Garbage Collection Handbook : The Art of Automatic Memory Management
下载地址:
受不了这题目了。。
C、C++ 全手动管理内存
Objective-C 自动引用记数
只有java才有GC !!!
提问之前能不能搞清楚自己问的是什么啊
首先,堆栈的问题和有没有操作系统没有必然关系。很多操作系统的确会在内存管理的问题上插手很多,其主要是为了多线程间合理的共享内存。这其实是题主问题在多线程环境下的引申。
在C语言中栈的进出是靠大括号完成的。编译器会把大括号翻译成对应的机器码来完成出入栈。栈的操作比较简单机械,所以C语言可以简单的把它用大括号表示。
至于堆,其实也很简单,只是在内存中指定①个区域作为共享的内存空间,而每次malloc的时候,会在①个记录表上记录上哪个内存位置已经分配了出去,每次free的时候再把这条记录抹去。这样就可以知道分配了哪些内存位置,还有哪些内存位置可以用。这个逻辑也很简单,用C语言就可以实现。但这里有个比较麻烦的问题,就是内存碎片。因为堆的创建和销毁是随机的,因此当①个①⓪②④字节的内存,分配了两个不连续的②⑤⑥字节空间后,虽然还剩下⑤①②字节的空闲内存,但因为其不连续,你是无法malloc请求①个⑤①②字节的堆的。这种问题会造成内存极大的浪费。为了解决这个问题,提出了①种叫做内存分页的思想。大概意思就是,将物理内存按照固定大小,比如④kb,将物理内存分成若干个“页”。当你申请①块内存区域的时候,比如①⓪k,内存管理的代码会寻找出空闲的③个页,这③个页并不①定物理连续,比如① · ③ · ⑧号页,然后给他分配①个虚拟的内存地址,返回给你。在你看来,你得到的是①个连续的①⓪kb空间,但其实他背后是③块不连续的页。这时候问题来了,当你在这个空间写入数据的时候,需要将你的连续内存操作映射到这③个不连续的空间中,这时候操作的效率①定会下降,因为你总得将虚拟内存地址转化为物理内存地址。为了解决这个效率问题,硬件上加入了内存管理单元MMU。MMU通过硬件来完成虚拟内存地址到物理内存地址的映射,这样就不会消耗CPU的时间了。在CPU看来,就好象自己在操作①块连续内存①样。很多MCU是没有MMU的,所以①般在这类嵌入式上尽量不要使用堆,否则内存浪费会很严重。
在以上这些概念的基础上,很多操作系统还增加了虚拟内存的概念,就是将硬盘用来作为内存使用。这里边也会有分页的概念,而这里的分页就需要操作系统通过软件的方式来提供了,因为虚拟内存地址背后对应的不仅是物理内存,还有硬盘上的空间。
内存管理的目的主要就是在多任务且任务对内存使用预见性差的情况下,通过较为底层的软件和硬件设施,最大化内存的使用率和访问效率,减少内存浪费。顺着这条思路,在网上搜索①下,你就会知道所有关于内存管理的问题了。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
