很长一段时间我都在为自己是一名“Java程序员”而烦恼;其他同学都在热火朝天的讨论C/C++的指针,问到我的时候,我只能苦笑“系统已经帮我做了”;“我不知道,自动回收了”。事实上语言并没有高下之分,可惜我还远未达到那个层次。后来慢慢体会到:
“Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来”
于是乎,下定决心了解Java的内存管理,以待将来“吹NB”用。
我是从操作系统的内存管理机制开始的,可惜从计算机组成,到计算机体系,再到操作系统 涉及内存的东西太多了,短时间内根本不可能有所收益,在我这个层次的开发来讲这些东西确实只是理论而已——没到那一步呢——不考虑南桥,北桥,以及高速缓存,多级缓存,多核处理,虚拟内存,系统内存管理,内存控制器等等这些细节,把他们交给硬件厂商和操作系统去操心,知道有这些东西就行;或者留待某个月圆之夜化身狼人之后再去理解。
从操作系统来讲,内存管理主要需要考虑四个问题,对应到Jvm上来:
1.当把一个快调入高一层存储器时,可以放到那些位置上?(映射规则)
对象是如何存储的?(顺序?位置?大小?)
2.当所要访问的块在高一层存储器时,如何找到该块?(查找算法)
虚拟机如何查找所需要的对象?如何调用函数?
3.当发生失效时,应该替换哪一块?(替换算法)
对象的清理
4.当进行写访问时,应进行哪些操作?(写策略)
流(I/O),文件以及其他I/O设备
把问题明确出来了,那么心中至少就有了一个方向了,而且可以按照这些问题可以建立起索引结构,不用担心忘记,也可以打败“害怕不全面的心理”
嗯,是的,该出发了!
说明:
这个分类下的文章基本上摘自:
《Java语言规范》
《Java虚拟机规范》
《深入Java虚拟机》
《深入理解Java虚拟机》
或进行了筛检,或加了自己的想法,但很多都是直接抄的,谢谢他们!
这个分类下的文章除商业用途外可以随意转载,请标注引用的上面这四份资料!