java虚拟机理解

纲领

  Java的运行时数据区为:

     A.     方法区   -----------(线程共有)

    B.     堆       -----------(线程共有)

    C.     虚拟机栈 -----------(线程私有)

   D.     本地方法栈-----------(线程私有)

    E.      程序计数器-----------(线程私有)

 注意:

     A.      线程私有,也就是说每条线程都有一个C,D,E这样的区域,这样才能在各个线程运行时不受影响

    B.       线程私有的数据区的生命周期与线程相同

 

虚拟机栈

   该栈为虚拟机执行java方法(字节码)服务,每个方法在执行的时候都会同时创建一个栈帧,用来储存局部变量表(该表存放基本数据类型,对象引用类型等。其中lang,double占用2个局部变量空间,其余的各占一个),操作数栈,动态链接,方法出口等信息

  其实,方法的执行就是一个方法的栈帧在虚拟机栈中入栈和出栈的过程

 (注意:通常所说的栈,指的就是虚拟机栈,确切地说是虚拟机中局部变量表的一部分)

 该区域有两种异常情况:StackOverFlowError和OutOfMemoryError

虚拟机启动时创建,存在的唯一目的就是存放对象的实例,几乎所有的对象都在该区域分配,是GC的主要工作区

方法区

  存储类信息,常量,静态变量等数据。GC在该区的主要目标是针对常量池的回收和对类型的卸载

 

  同时注意该区域有“运行时常量池”,用于存放编译期生成的各种字面变量和符号引用。该池的一个重要特征就是具有动态性,也就是说java不要求常量一定只能在编译期间产生,在运行期间也可以将新的常量放入池中,典型的方法就是String类的intern()方法

  举例说明:”HelloWorld”.intern(),返回的仍然是Hello World但是这个方法会检查字符串池中是否有“Hello World”这个字符串。如果存在则返回这个字符串的引用,否则就将该串放入池中(注意:这是在运行期间完成的工作,不是编译期),然后返回这个字符串的引用

同时要注意的是,new 关键字创建的字符串是不会放入字符串池中的,它有自己的地址空间

 可抛出的异常:OutOfMemoryError

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值