jvm运行时数据区域

原创
2017/08/10 22:29
阅读数 9

1、程序计数器

     它可以看作当前线程所执行的字节码的行号指示令;在单核多线程的环境下,线程之间会

进行上下文切换,交替使用cpu, 在交替的过程中,程序计数器会记录该线程执行到哪儿了, 然后继续执行。

2、Java虚拟机栈

      Java虚拟机栈描述的是Java方法执行的内存模型;每个方法在执行的同时会生成一个栈

帧,用于存储局部变量,操作数栈,动态链接,方法的出口信息,每个方法调用到完成的过程,都对应一个

栈帧在虚拟机栈中从入栈到出栈;

      局部变量表:存放编译器可知的各种基本数据类型,对象引用;

     如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlowError 异常;类似于数组IndexOutOfBounds异常;

     如果虚拟机栈可以额动态扩展, 如果扩展的时候无法申请到足够的内存,就会抛出OutOfMemoryError异常;

3、本地方法栈

    与Java虚拟机栈所发挥的作用非常相似,本地方法栈则是虚拟机使用到的native方法;

4、Java堆

     Java堆是所有线程共享的一块内存区域,在虚拟机启动时候创建,所有的对象实例和数组都要在堆上分配;

     堆还可以细分为:新生代,老年代,永久代perm;再细致点新生代分为:Eden空间,From Survivor空间,To Survivor空间;基本上的分配比例为8:1:1,垃圾回收(标记-复制的时候)需要用到。

5、方法区

     各个线程共享的内存区域,用于存放已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的

代码的等数据;功能类似于堆,但是 non-heap

6、运行时常量池

   Runtime Constant pool 是方法区的一部分,class 文件中除了有类的版本,字段,方法,接口等描述信息

外,还有一项信息是常量池,用于存放编译器期生成的各种字面常量和符号引用,这部分内容将在类加载后

进入方法区的的运行时常量池中存放,ps:各种字面量类似于反编译的时候回看见各种数字,这些数字会单独

的存放到常量池里面;

7、直接内存、

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
在线直播报名
返回顶部
顶部