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流效率高的原因)。

时间: 2024-08-02 02:49:04

Java虚拟机学习--记录运行时数据区域的相关文章

深入理解Java虚拟机读书笔记---运行时数据区域

运行时数据区域 1.程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成.由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令.因此,为了线

深入理解Java虚拟机:运行时数据区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范(Java SE 7版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里

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

http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Ja

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

前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Java API类库 第三方Java类库 可以把Java程序设计语言.Java虚拟机和Java API类库这三部分

JVM学习笔记:Java运行时数据区域

JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私有的,即每个线程各自都有自己的一份.绿色部分是各个线程共享的. 1.PC寄存器(The pc Register) (1)每一个Java线程都有一个PC寄存器. (2)PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息. (3)此内存区域是唯一一个在JV

《深入理解java虚拟机》笔记(1)运行时数据区域

1.Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 2.运行时数据区域划分 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个区域,这些区域都有各自的用途,创建和销毁时间,有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户线程的启动和结束而建立和销毁,根据<Java虚拟机规范(Java SE 7版)>的规定,java虚拟机分为以下区域. 2.1.程序计数器(Program Counter Register)

Java虚拟机运行时数据区域

Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,及创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁.Java虚拟机所管理的内存包括以下几个运行时数据区域,如图(图片引自网络): 1.1 程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器.字节码解释器就是通过改变该计数器的值来选取下一条需要执

Java运行时数据区域

运行时数据区域 Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在, 有些区域则是依赖用户线程的启动和结束而建立和销毁.如图 1.1 程序计数器 是一块内存比较小的空间.作用:用来标志当前线程所执行的字节码的行号指示器(即在字节码中添加编号).在jvm中,字节码解释器工作时就是通过改变这个计数器上的值来选取下一条需要执行的字节码指令.在分支.循环.跳转.异常处理.线程恢复等功能都需要

Java运行时数据区域划分

Java运行时数据区域划分 Java JVM 内存 堆 栈 1. 概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不容易出现内存泄漏和内存溢出现象.但如果不了解虚拟机是如何使用内存的,一旦出现了内存泄漏和溢出方面的问题,那么排错就无从下手了. 2. 运行时数据区域 Java虚拟机在执行Java程序的过程中会将它所管理的内存划分为若干个不同的数据区域,如下图所示. 2.1. 程序计数器 程序计数器(Program Counter Register):是一块较小的内存空间,可以看做是当前线