如何理解把内存分为4段,栈区,堆区,代码区,全局变量区?

内存可分为4段,或者有人说是5段云云。
可是,内存为什么要这样分配呢?
这里的内存应该指的是虚拟内存吧,这样分配之后,再通过段页式存储机制映射到实际的物理内存,岂不挺麻烦的? 比如:char *p3 = "123456"; // 123456\0在常量区,p3在栈上。 这样把程序分解的支离破碎的到底是否能真的提高效率?

还有,代码区是个什么啊,不是把代码都解体了吗,该去栈的到栈里去个,该去静态区的区静态区。

1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源;

2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收;

3、全局变量区(datasegment)—存放全局变量,静态变量和字符串常量,不释放;

4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-02-10
应该是DLL, EXE等文件 分为代码区和数据区
代码区的是只读的, 防止代码恶意写入
数据区再分为只读, 读写, 只写

然后EXE载入内存的时候, 分为静态区, 栈区, 和堆区
文件数据区的数据肯定, 放在静态区
代码执行时产生的临时数据, 放在栈区
代码执行时产生的持续性数据, 放在堆区

虚拟内存是把硬盘的空间, 挪为内存使用. 系统这么做是有目的的, 包括
扩展内存, office自动存储文件, 休眠等等

虚拟内存只是个服务, 你说的分解代码和它的用途无关,
分段式和分页式是实现虚拟内存技术的时候才有意义.

最后代码区放在程序无权访问的0x7FFFFFFF以上的异次元内存空间.追问

我说的虚拟内存指的是虚拟地址空间,比如linux就有4G的虚拟内存。

还是上面那个问题:char *p3 = "123456"; // 123456\0在常量区,p3在栈上。

程序是在编写的时候,就把相应的值写到对应的内存区吗,还是编译的时候才分配的?或者说是运行的时候才写到对应区的?

【虚拟内存和虚拟地址空间 两个概念不指名,就容易混淆了】

追答

常量区的数据在链接的的时候就放入*.exe的数据区, 所有数据区的东西在读入内存时候, 都放入常量区

虚拟内存和虚拟地址空间是完全不同的概念.
32位的CPU都只有4G的寻址空间.虚拟不虚拟无关系.

本回答被提问者和网友采纳
相似回答