Java虚拟机学习--记录运行时数据区域

Posted _zjyc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java虚拟机学习--记录运行时数据区域相关的知识,希望对你有一定的参考价值。

为方便后面学习的理解,记录一下!

运行时数据区

   1.线程共享

      1.1方法区(Method Area)

         1.1.1运行时常量池(Runtime Constant Pool)

      1.2堆(Heap)

   2.线程私有

      2.1虚拟机栈(VM Stack)

      2.2本地方法栈(Native Method Stack)

      2.3程序计数器(Program Counter Register)

   3.直接内存(Direct Memory)

虚拟机栈:

  线程私有,生命周期与线程同步,用来执行Java方法。

  每个java方法执行时都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息,方法执行过程即出栈和入栈的过程

程序计数器:

    占有着一小块内存空间,是线程私有的,可以看作是程序运行的行号指示器,用来记录当前线程运行时下一条需要执行的指令,在JAVA虚拟机中,字节码解释器工作时通过改变计数器的值来选取下一条需要执行字节码指令(可以理解为代码,因为当执行的是Native方法时,计数器的值为空,这个时候执行的不是Java代码)。

    多线程实质上是cpu在多个线程上不停的切换,给每个线程在一个时间段内都有一小块运行时间,由于cpu切换太快,所以我们感受到的是多个线程在同时运行。程序计数器就是java虚拟机为保证多线程的情况下cpu能准确地执行下一条指令而存在的。

本地方法栈:

  和虚拟机栈一样,不过不同之处在于虚拟机栈是为Java方法服务,而本地方法栈是为Native方法服务。

Java堆:

  所有线程共享的一块区域,目的是存放实例对象,因此Java堆也是垃圾收集器主要回收的区域。

方法区:

  所有线程共享,用来存放已加载的类信息、常量、静态变量、即时编译后的代码等。

  由于方法区中的信息一般都是需要经常用到,因此也基本上不会被回收。

运行时常量池:

  方法区用来存放常量的一块区域,所谓常量也就是基本值,无法被改变的如一个数字,一段字符串等,除了编译期间产生的常量,运行期间产生的常量也会被保存在里面。

直接内存:

    通常来说,java应用不会只是封闭在虚拟机中,当需要与外界交互时必然是数据的交流,使用外部数据时外部的内存相对于虚拟机来说就是Native堆,也就是直接内存,NIO(New Input/Out)类就是基于通道(Chanel)和缓冲(Buffer)的Io流,可以通过Native函数库直接操作本地内存(Native堆),避免了在Java堆和Native堆中来回复制数据(这也是为什么NIO流比IO流效率高的原因)。

 

以上是关于Java虚拟机学习--记录运行时数据区域的主要内容,如果未能解决你的问题,请参考以下文章

深入JAVA虚拟机之类加载机制

Java虚拟机结构原理与运行时数据区域

Java虚拟机 - 结构原理与运行时数据区域

关于JVM了解学习心得总结记录

Java虚拟机 - 运行时数据区域

Java虚拟机 - 运行时数据区域