Java虚拟机一:运行时数据区域】的更多相关文章

一.运行时数据区域 1.程序计数器 程序计数器( Program Counter Register) 是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器. Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻, 一个处理器( 对于多核处理器来说是一个内核) 都只会执行一条线程中的指令. 因此, 为了线程切换后能恢复到正确的执行位置, 每条线程都需要有一个独立的程序计数器, 各条线程之间计数器互不影响, 独立存储, 我们称这类内存区域…
1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行中的虚拟机实例 Java虚拟机抽象规范仅仅是一个概念,在<The Java Virtual Machine Specification>中有详细的描述. 该规范的实现,可能来自多个提供商,并存在于多个平台上,它或者是全部由软件实现,或者是以硬件和软件相结合的方式来实现.JVM的实现有很多,广为使用…
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 这些区域都有各自的用途.各自的创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程启动和结束而建立和销毁. 根据<Java虚拟机规范(第2版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 线程共有:方法区.堆 线程私有:Java虚拟机栈.本地方法栈.程序计数器 下面分别来了解一下这几个区域. 一.程序计数器(Program Counter Register)…
Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随线程的开始和结束而创建和销毁. Java虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器(Program Counter Register) 它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器. 每一条JVM线程都有自己的PC寄存器,各条线程之间互不影响,独立存…
前言 不知道自己不知道,不知道自己知道,知道自己不知道,知道自己知道,目前处于知道自己不知道这个阶段,很痛苦啊,干了4年了运维,是一个坎.越来越发觉想要走得远,还是得扎根底.   一.运行时数据区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.   1)程序计数器 程序计数器(Program Counter Register)…
Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的数据区,也就是说每一个线程都有自己的这么一个区域存放自己的数据,而青色区域则是线程共享的,里面的数据为所有线程共有,原则上都有权限访问. 2.程序计数器: 用途:用来给程序导航指路的.这个是一块较小的内存空间,可以看做是当前线程执行的字节码的行号指示器.理解就是虚拟机把java源代码编译成了字节码,…
前言:从我学Java的第一天开始,我的大学老师就告诉我 Java语言相比C.C++的语言有一个非常强大的功能,那就是自动内存管理:我们用Java编码时不需要申请或释放内存等,这些工作全部交由我们的Java虚拟机(以下简称JVM)来帮助我们管理.从那之后 ,我发现我们在写Java代码的就不需要去管理内存. 但我经常会发现一些问题,诸如内存溢出或内存泄露,从那以后我就开始关注JVM,它是怎样帮我们管理内存:对比C++程序员,用一句通俗的话讲,那就是墙外的人向进去看看,墙内的人想出来走走~~因此,本篇…
前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 数据类型 java总共有两种数据类型:基本类型和引用类型.java虚拟机的设计目标是期望在运行前执行类型识别,并且通过编译器识别而不是jvm虚拟机本身.具体的类型如下所示: 基本类型: numeric,如int.float.double等 boolean,实际上boolean类型与int类型在jvm中的处理方式是一样的,也是8bit,true和false分别映射为1和0…
前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调. 引用 java虚拟机规范 java虚拟机规范-运行时数据区 java内存运行时的栈帧结构 java code to byte code 栈帧 每当一个java方法被执行时都会在虚拟机中新创建一个栈帧,方法调用结束后即被销毁. 栈帧存储空间为虚拟机栈,每一个栈帧都有自己的局部变量表.操作数栈和指向当前方法所属的类的运行时常量池的引用. 在每个线程中,只有目前正在执行的那个方法的栈帧是活动的.这个栈…
Java虚拟机管理的内存包括如图所示的运行时数据区域: 下面分别进行介绍: 1)程序计数器(Program Counter Register) 占用的内存空间比较小,主要作用就是标识当前线程执行的字节码的行号.字节码解释器的工作就是通过不断改变计数器的值来获取下一条要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等功能都需要依赖程序计数器. 程序计数器在每个线程中都是独立互不影响的,因为Java虚拟机多线程的实现是通过轮流切换并分配时间给每个线程来完成的.每个处理器在一个确定的时刻只会执…
一. 运行数据区域划分 各个数据区域功能如下: 1. 程序计数器: 较小的一块内存空间,可以看做是当前线程所执行的字节码的行号指示器,每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,这类内存区域称为"线程私有"的内存. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址: 如果正在执行的是Native方法,这个计数器值则为空: 此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError情况的区域.…
java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域.每个区域都有各自的用途,创建和销毁时间,按照<java虚拟机规范(Java SE 7 版)>的规定,虚拟机运行时数据区域主要有以下几种: 1.程序计数器 程序计数器是很小的一块内存区域,可以看做是当前线程所执行字节码的行号指示器.在虚拟机的概念模型中,字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能均依赖于程序计数器.在多线程中,每个线程都有…
我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Java API类库 第三方Java类库 可以把Java程序设计语言.Java虚拟机和Java API类库这三部分统称为JDK(Java Development Kit),它是Java程序开发的最小环境.另外,Java API中的Java SE API子集和Java虚拟机这两部分统称为JRE…
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Ja…
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理解Java虚拟机 >(周志明著)读书笔记. Java程序员一般都知道JVM中存在栈和堆的,并简单了解对象是在堆上分配的,这点从C/C++转过Java的程序员很容易想到.但Java由于其自身的特性,还有一些其他的内存区域,如下图所示: 程序计数器 程序计数器占用的内存空间不大,里面记录了各线程当前字节码的…
1.Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 2.运行时数据区域划分 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个区域,这些区域都有各自的用途,创建和销毁时间,有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户线程的启动和结束而建立和销毁,根据<Java虚拟机规范(Java SE 7版)>的规定,java虚拟机分为以下区域.…
Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果是一个单核的机器(或单cpu),严格意义上在一个时间块中只会有一个线程在执行.为了线程切换以后能恢复到正确的执行位置,每个线程都需要有一个单独的计数器,每个计数器之间要是独立的互不干扰. 如果线程执行的是Java方法,那么PC指向的是正在执行的虚拟机字节码指令的区域,如果执行的是native方法,那…
一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器.字节码解释器在执行时通过改变计数器的值来选取下一条要执行的字节码的指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成 程序计数器是线程私有的内存区域 此内存区域是唯一一个Java虚拟机规范中没有规定任何OOM(O…
转载:  https://blog.csdn.net/a745233700/article/details/80291694  (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼) 一 java运行时内存中的数据区域 每一个Java程序启动后,会获得一个JVM的实例,用来管理内存.Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有个字的用途,以及创建和销毁时间.Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1.…
根据<Java虚拟机规范(第2版)>的规定,Java虚拟机管理的内存包括下图几个运行时数据区域: 1.程序计数器        程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成…
运行时数据区域 线程私有(随用户线程的启动和结束而建立和销毁)或所有线程共享(随虚拟机进程的启动而存在) 抛出的异常 备注 程序计数器(Program Counter Register) 线程私有 唯一不抛出 OutOfMemoryError 异常的区域 虚拟机栈(VM Stack) 线程私有 会抛出 StackOverflowError.OutOfMemoryError 本地方法栈(Native Method Stack) 线程私有 会抛出 StackOverflowError.OutOfMe…
JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私有的,即每个线程各自都有自己的一份.绿色部分是各个线程共享的. 1.PC寄存器(The pc Register) (1)每一个Java线程都有一个PC寄存器. (2)PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息. (3)此内存区域是唯一一个在JV…
目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内存模型 JVM实现的堆内存和方法区 新生代和老年代. 新生代中的内存划分 由JDK1.7及以前的永久代到JDK1.8的元数据区 参考资料 介绍 初学Java虚拟机几天, 被方法区, 永久代这些混杂的概念搞混了. 我觉得学习这部分知识应该把官方定义的虚拟机运行时数据区域和虚拟机内存结构分开叙述, 要不…
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范(Java SE7版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域.如下图所示 1. 程序计数器 程序计算器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟…
运行时数据区域 Java虚拟机所管理的内存将会包括以下几个运行时数据区域 线程私有区域 1.程序计数器   程序计数器记录的是当前正在执行的虚拟机字节码指令所在的地址.在虚拟机的概念模型中,字节码解释器就是通过改变这个计数器来获取下一条需要执行的字节码指令.分支,循环,跳转,异常处理,线程回复都需要依赖该计数器完成.   每条线程都有一个独立的程序计数器,各程序计数器之间互不影响,独立存储,我们称这类内存区域为线程私有的内存.此内存区域是虚拟机中唯一没有规定任何OutOfMemoryError的…
Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型. Java运行时数据区域 众所周知,Java 虚拟机有自动内存管理机制,如果出现内存泄漏和溢出方面的问题,排查错误就必须要了解虚拟机是怎样使用内存的. 下…
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间.根据<Java虚拟机规范(Java SE 7版>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示. 程序计数器 程序计数器是一块较小的内存空间,它可以看做是当前线程(每个线程都有一个独立的程序计数器)所执行的字节码的行号指示器. Java虚拟机栈 Java虚拟机栈也是也是线程私有的.虚拟机栈描述的是Java方法执行的内存模型:每个方法在执…
根据<Java 虚拟机规范(Java SE 7版)>规定,Java虚拟机所管理的内存,将会包括以下几个运行时数据区域: 注: 1.由所有线程共享的数据区: 对应 java内存模型的主内存,各线程共有: 2.线程隔离的数据区:对应 java内存模型的工作内存,各自线程持有: 1.程序计数器(线程私有) 程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在虚拟机的概念模型里,字节码解释器工作时,就是通过改变“这个…
2.1 概述 对Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个对象的new操作去写配对的delete/free 代码,不容易出现内存泄露和内存溢出的问题.不过,仍然需要Java虚拟机是如何使用内存的,方便我们定位内存泄露和内存溢出的问题: 2.2 运行时数据区域 Java虚拟机在执行Java程序时会把它所管理的内存划分为若干个部分,这些区域有各自的用途.创建和销毁时间,有的区域随着虚拟机进程的启动而一直存在,有的则依赖用户线程的启动和结束而建立和销毁. JDK 1.8 之前…
最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 1.程序计数器:线程隔离的数据区域,当前线程所执行的字节码的行号指示器. PC寄存器( PC register ):每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器.PC寄存器里保存有当前正在执行的JVM指令的地址. 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的.…