java虚拟机运行时数据区域简要理解

摘要:Java虚拟机是博主在阅读周志明先生的深入了解java虚拟机所做的简要笔记,帮助自己恢复学习,如果能帮到他人十分荣幸;

在java中,虚拟机管理的内存将会包括以下运行时数据区域:

1.程序计数器(Program counter register)

  1.        程序计数器是一块比较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。其作用是字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖计数器来完成。
  2.        java虚拟机的多线程其本质其实是轮流运行切换分配器处理时间来实现的。例如:三个线程同时运行,其本质是在很短时间内,A线程先运行,运行一段时间片(A线程可能运行结束也可能没结束)B线程接着运行一个时间片,然后运行,接着C。一圈结束后,又到了A线程继续运行(A线程在上次没有运行完的情况下)。一个时间片很短,这样给用户的错觉是三个都在同时运行。

        因此为了保证多线程互相不影响,因此每个线程都有自己独立的计数器,各线程计数器互不影响,独立存储。

         小技巧:如果大家学过计算机基础课程,可以任务他就是PC;

2.java虚拟机栈(Java Virtual Machine Stack)

  1.       和计数器一样,java虚拟机栈也是线程私有的,它的生命周期与线程相同。
  2.       虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(先简要理解为一个可以存储很多东西的栈最小单位) 用于存储局部变量表,操作数栈,动态链表,方法出口。每一个方法从调用到执行完毕的过程,都伴随着一个栈帧在虚拟机栈进栈和出栈。
  3.       局部变量表存放了编译期可知的各种类型基本数据类型(boolean,byte,char,short.int,float,long,double)对象引用(reference类型)等。

3.本地方法栈(Native Method Stack)

       本地方法栈与虚拟机栈发挥的作用很相似,它们的区别是虚拟机栈为java方法(字节码)服务,本地方法栈是为虚拟机使用到的native方法服务。有些虚拟机将两者合二为一。

4.java堆

  1. java堆(heap)是java虚拟机中所管理内存中最大堆一块,java堆是被所有线程共享堆一块内存区域。它的唯一目的就是在虚拟机启动时创建,用来存放对象实例。
  2. java堆是垃圾回收器管理主要区域,因此很多时候被称为“GC堆”(Grabage Collection Heap)。

5.方法区

  1. 方法区和Java堆一样,是各个线程所共享堆区域,它用于存放已被虚拟机加载堆类的信息,常量,静态变量,即时编译后的代码等数据。

  2. java虚拟机对方法区的限制非常宽松,除了和java堆一样不需要连续堆内存和可以选择固定大小或者可拓展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,这个区域的回收“成绩”比较难让人满意。尤其是类型的卸载,条件相对苛刻。

6.运行时常量池

  1. 运行池常量池(Running Constant Pool)是方法区的一部分。Class文件除了有类的版本,字段,方法,接口等描述信息,还有一项信息是常量池,用于存放编译时产生的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
  2. 运行时常量池具有动态性:运行时常量池相对于Class文件常量池的另外一个特征就是具备动态性,java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中的常量池的内容才能进入方法区运行池常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用比较多的是String类的intern()方法。

      在java中八大基本类型和特殊类型String类型,为了提高他们的运行效率,设置了缓冲池(运行时常量池)8大基本类型的常量池都是系统调用的,String主要方法有两种:

      (1)直接使用双引号声明的String对象会直接存放在运行池常量池中。

      (2)如果不是使用双引号声明String对象,可以使用String的intern方法。intern会查询常量池中是否存在当前字符串,如果不存在则将该字符串放入常量池中。

7.直接内存

  1. 直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但是这部分内存还是被频繁使用,而且可能造成OutOfMemoryError异常。
  2. 显然,本机直接内存的分配不会受到java堆大小的限制,但是,既然是内存,肯定还是会受到本机总内存大小以及处理器寻址空间的限制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值