关于数据区中存放的东西

Java运行时的数据区包括:(其中前两个是线程共享的)
1.方法区(Method Area) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
2.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存
3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Frame(方法运行时的基础数据结构)用于存储局部变量表、操作数栈、动态连接、方法出口等信息
4.本地方法栈(Native Method Stack)  与虚拟机栈了类似,不过则为虚拟机使用的到的Native方法服务。(有的虚拟机譬如Sun HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一)

5.程序计数器(Program Counter Register) 可看作当前线程所执行的字节码的行号的标识器.



 1>栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址。.esp 始终指向栈顶, 栈中的数据越多, esp的值越小。 
 2>堆区:用于存放动态分配的对象, 当你使用 malloc和new 等进行分配时,所得到的空间就在堆中。动态分配得到的内存区域附带有分配信息, 所以你  能够 free和delete它们。 
 3>数据区:全局,静态和常量是分配在数据区中的,数据区包括bss(未初始化数据区)和初始化数据区。 
注意: 
    1)堆向高内存地址生长; 
    2)栈向低内存地址生长; 
    3)堆和栈相向而生,堆和栈之间有个临界点,称为stkbrk。 

一条进程在内存中的映射 
    假设现在有一个程序,它的函数调用顺序如下: 
    main(...) ->; func_1(...) ->; func_2(...) ->; func_3(...),即:主函数main调用函数func_1; 函数func_1调用函数func_2; 函数func_2调用函数func_3。 
    当一个程序被操作系统调入内存运行, 其对应的进程在内存中的映射如下图所示:

 


猜你喜欢

转载自blog.csdn.net/shytan/article/details/77154498