关于Java内存分配
一.Java程序运行在java虚拟机(JVM百度百科 )上,Jvm可以运行在任何系统,Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。
二. Java的内存区域
1.寄存器:特点是存取速度非常快,程序无法控制,JVM只设置了4个最为常用的寄存器 pc程序计数器 optop操作数栈顶指针 frame当前执行环境指针 vars指向当前执行环境中第一个局部变量的指针 所有寄存器均为32位。pc用于记录程序的执行,optop,frame和vars用于记录指向Java栈区的指针。
2.栈:保存局部变量的值,其中包括基本数据类型的值,类的实例(也就是对象的引用),也可以保存加载方法的帧
3.堆:用来存放动态产生的数据,比如new出的对象(赋给引用),注意new出来的对象仅包含自身变量,而不包含类内定义的方法,这样就避免了方法重复加载
堆栈百度百科
4.常量池:用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = “java”这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。常量池百度百科
5.代码段 :存放程序执行代码的一块内存区域。代码段百度百科
6.数据段:用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。数据百度百科