如何理解把内存分为4段,栈区,堆区,代码区,全局变量区?
发布网友
发布时间:2022-04-29 05:36
我来回答
共2个回答
热心网友
时间:2022-06-19 19:53
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源;
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收;
3、全局变量区(datasegment)—存放全局变量,静态变量和字符串常量,不释放;
4、代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域。
热心网友
时间:2022-06-19 19:53
应该是DLL, EXE等文件 分为代码区和数据区
代码区的是只读的, 防止代码恶意写入
数据区再分为只读, 读写, 只写
然后EXE载入内存的时候, 分为静态区, 栈区, 和堆区
文件数据区的数据肯定, 放在静态区
代码执行时产生的临时数据, 放在栈区
代码执行时产生的持续性数据, 放在堆区
虚拟内存是把硬盘的空间, 挪为内存使用. 系统这么做是有目的的, 包括
扩展内存, office自动存储文件, 休眠等等
虚拟内存只是个服务, 你说的分解代码和它的用途无关,
分段式和分页式是实现虚拟内存技术的时候才有意义.
最后代码区放在程序无权访问的0x7FFFFFFF以上的异次元内存空间.追问我说的虚拟内存指的是虚拟地址空间,比如linux就有4G的虚拟内存。
还是上面那个问题:char *p3 = "123456"; // 123456\0在常量区,p3在栈上。
程序是在编写的时候,就把相应的值写到对应的内存区吗,还是编译的时候才分配的?或者说是运行的时候才写到对应区的?
【虚拟内存和虚拟地址空间 两个概念不指名,就容易混淆了】
追答常量区的数据在链接的的时候就放入*.exe的数据区, 所有数据区的东西在读入内存时候, 都放入常量区
虚拟内存和虚拟地址空间是完全不同的概念.
32位的CPU都只有4G的寻址空间.虚拟不虚拟无关系.