JVM内存区域及作用

来源:互联网 发布:下雪 动态壁纸软件 编辑:程序博客网 时间:2024/05/16 10:00

jVM内存模型:



(1)程序计数器     
记录当前正在执行的虚拟机指令的地址

(2)本地方法栈  
 则是虚拟机用到的native方法服务,在java源码中会看到 native方法都没有实现,大多数都是通过c,c++实现的。

(3)堆     
 堆的唯一目的就是存放对象实例,几乎所有对象实例都在这里分配内存,所有的对象实例以及数组都要在堆上分配内存

(4)虚拟机栈
   虚拟机栈则是我们要熟知的重点,是线程私有的。我们要明白虚拟机栈的应用场景:它是应用在java方法执行的时候,java方法的代码是怎样执行的,这就需要虚拟机栈了。虚拟机栈会为每个执行的方法创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。那么神马是局部变量表,什么又是操作数栈呢?下面请听我细细道来。





 我们通过代码说明,我们看上面这个main方法,它的局部变量表如下图:
  
可以看到局部变量表存储的就是该方法中的形参和局部变量,那么怎样将值赋值给我这些局部变量表呢?这就用到我们的操作数栈了,同时还要用到 jvm指令集,通过指令去调用 操作方法区的常量池,局部变量表以及其他的信息,在操作数栈中进行进栈和出栈操作,赋值给局部变量表,这些东西在后面的博客中都会拿实例详细介绍.有同学可能就会问了,学了这个东西有什么用呢?对写代码有用吗? 我只能回复你的是,学了这个可以让你更加的理解java代码,能够看到java代码底层执行的东西,我打个比方:
     
      String a="abc";      String b="a"+"bc"  ;    String c="a"+new String("bc");      System.out.print(a==b);      System.out.print(a==c);

 程序运行的结果是:第一个是true,第二个是false ;a==b 为啥是true呢?a又为啥不等于c呢?通过看指令都能看到它内部运行了,自然就知道为啥不相等了。当然大家不要以后这些很难,其实学过汇编语言的同学就知道,这些指令都类似,了解基本的,然后用到时能够对照着去解释程序就差不多了,这能帮你更了解代码的运行机制。还有,我们都知道 jdk1.5后新增了 基本类型和包装类型的自动装箱和拆箱操作,那你知道它的内部是怎样运行的吗?学了虚拟机指令,通过配置 javap(这个命令可以查看任意代码的 指令集,后面会介绍),就都能看到了,哈哈,有没有被 这么强大的装逼技术吸引呢?嘿嘿,这学会了,装逼技术妥妥的!
  
 (5)方法区
   方法区是存储已经被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。也是我们应该重点了解的地方,因为它涉及到存储常量信息,比如说 上面main方法中 String c="xiaotang";  这个"xiaotang"字符串就是存储在方法区中的常量池中。
    运行时常量池是方法区的一部分,Class文件中除了 有类的版本、字段、方法、接口等描述信息,还有一项是常量池,用于存放编译时期生成的各种字面量和符号引用,这部分内容在类加载后进入方法区的运行时常量池存放.


0 0
原创粉丝点击