java 学习之JVM深入分析(一)

java 虚拟机在执行java程序的过程中,会把它所管理的内存划分为若干个不同的区域。

注:java 虚拟机所管理的内存将会包括以下几个运行时数据区域

1.程序计数器,字节码解释器工作时,就是通过改变这个计数器的值来选择下一条需要执行的字节码指令分支,循环,跳转,异常处理,线程恢复都需要来这个计数器完成。

注:线程私有的内存:每个线程都有一个程序计数器,互不影响,独立存储。

2.java虚拟机栈:

(1).栈帧:用于存储局域变量表,操作数栈,动态链接,方法出口等信息。

注:每一个方法从开始调用到执行完毕的过程,就是对应着一个栈帧在虚拟机中从入栈到出栈的过程。

(2).大家经常说的堆栈,栈就是虚拟机栈,或者说是里面的局部变量表部分。

注:局部变量表存放了(boolean.byte.int.float.char.short.long.double)的基本数据类型,对象引用类型(可能是一个指向存放对象起始地址的指针),和returnAddress类型

64位的long和double类型的数据会占两个局部空间,其余的占一个,此区域会报两种异常:

第一种:在虚拟机栈动态扩充时,无法申请到足够的内存,就会报OutOfMerryError异常

第二种:线程请求的栈深度大于虚拟机所允许的深度,会报StackOverFlowError异常

(3).本地方法栈(与虚拟机类型相似)

区别:虚拟机栈为java虚拟机执行java 方法服务,本地方法栈为虚拟机使用到的native方法服务

相同点:都是抛出以上两种类型的异常

注:有些虚拟机将二者合二为一,如:SunHotSpot

(4).java堆

java对在虚拟机启动时创建,被所有的线程所共享,可以处在物理上不连续的内存空间中,只要逻辑上连续即可

作用:第一,存放对象实例,几乎上所有的对象都要在堆上分配内存空间,但是随着逃逸分析和标量替换的技术日益成熟,现在也有很多实现了栈上

分配的现象,如果对中没有完成为对象分配内存空间,并且堆也无法再扩展时,就会抛出OutOfMerryError异常

第二,GC堆,是垃圾收集器管理的主要领域

(5)方法区:

被各个线程共享,用于存储被虚拟机加载过的类信息,常量,静态变量,即时编译器编译后的代码等数据,当方法区无法满足内存分配的需求时,将抛出OutOfMerryError异常。

(6)直接内存:

它并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范定义的内存区域,但是这部分内存也被频繁的使用,而且也可能导致OutOfMerryError一成的出现

注:基于通道与缓存区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirctByteBuffer对象作为这块内存的引用进行操作,因为避免了在java堆和Native堆中来回复制数据,本机直接内存大小不会受java堆限制。

(7)运行时常量池:

运行时常量池是方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项是常量池,用于存放编译器生成的字面量和符号引用,这部分内容将在

类加载后进入方法区的运行时常量池进行存放。

java虚拟机对.Class文件每一个部分的格式都有严格的规定,每一个字节用于存储那种数据,都必须符合规范上的要求才能够被虚拟机认可,装载和执行,一般来说,除了保存.Class文件中描述的符号引用外,还会把翻译出的直接引用也存在在运行时常量池中。受方法区内存限制,当内存无法再扩展时,也会报OutOfMerryError异常

以上是笔者的读书笔记总结,主要介绍了运行时数据区域的几个大的模块,希望能够对读者有用。

时间: 2024-12-31 21:29:26

java 学习之JVM深入分析(一)的相关文章

java学习-----jvm的内存分配及运行机制

VM运行时数据区域: 根据<Java虚拟机规范(第二版)>的规定,JVM包括下列几个运行时区域: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的

《Java程序性能优化》学习笔记 Ⅳ JVM调优

第五章 JVM调优5.1 Java虚拟机内存模型1.JVM虚拟机将其内存数据分为程序计数器.虚拟机栈,本地方法栈,Java堆,和方法去等部分.5.2 JVM内存分配参数5.3 垃圾收集基础5.4 常用调优案例和方法5.5 使用JVM参数5.6 实战JVM调优 <Java程序性能优化>学习笔记 Ⅳ JVM调优

好程序员Java学习路线分享JVM类加载机制

好程序员Java学习路线分享JVM类加载机制,JVM相关概念 jdk<br>jdk(Java Development Kit)Java开发包,是Java开发人员用于编译和调试程序的一套程序的集合. jre<br>jre(Java Runtime Evironment)Java运行时环境,是运行Java程序的平台,所有的Java程序必须在这个平台中才能执行. jvm<br>jvm(Java Virtual Machine)Java虚拟机,是用代码虚拟出来的计算机,模拟执行

Java学习2 - JDK和JRE和JVM的区别_JDK的下载安装_环境变量配置

一 JDK和JRE和JVM的区别 Jdk: Java Development kit - Java 开发工具 JRE: Java Runtime Environment - java运行环境 JVM: Java Virtual Machine - Java 虚拟机 关系:Jdk包含JRE,JRE包含JVM 二 Java 开发环境配置 1.下载JDK: www.oracle.com(download->Java(右侧)->Java SE (includes JavaFX) | Early Acc

JAVA读书推荐----《深入分析Java Web技术内幕》--《java多线程编程核心技术》--《大型网站技术架构 核心原理与案例分析》-《Effective Java中文版》

(1)  首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life. 目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客.这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是: 1.随便开篇点明该设计模式的定义 2.图文并茂讲解该设计模式中的结构 3.以详细的代码形式写一下该种设计模式的实现 4.补充内容 5.讲解该设计模式的优缺点 对于一个设计模式我们关

Java 详解 JVM 工作原理和流程

作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应用程序接口(JavaAPI).它们的关系如下图所示: 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执

java学习笔记——韩顺平视频

第0讲:开山篇 1.  Java se J2se        桌面 Java ee J2ee        网络 Java me J2me        手机 2.  SQL server   Mysql   Oracle 3. 学习软件编程的注意事项 1.高效愉快学习 2.先建立一个整体框架然后细节 3.用什么再学习什么 4.先知道how,再知道why 5.软件编程是一门"做中学"学科,做了才会 6.适当囫囵吞枣 7.琢磨别人怎么做,不是我认为这么做 第1讲  内容介绍.项目演示.

java学习路线

在学校里学到的东西太浅了,工作中才发现啥也不会,很是困扰.来公司实习了一个月了,进展很慢,导师和boss可能对我有些失了一些信心,但我自己不能对自己丢了信心. 到了迷茫期,所以在网上找些过来人的经验自我指导,我相信坚持下去一定会有破茧成蝶的一天的~ 摘抄心灵: 这些年我一直提醒自己一件事情,千万不要自己感动自己.人难免有天生自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里.我们每人都有别人不知道的创伤,我们战斗就是为了摆脱这个创伤. ------卡尔维诺 卡尔维诺中文站:http://ww

Java 学习路线建议

在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬.2.下面对于[第一部分]的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学. 如果你是在校学生,务必要在学好基础(比如计算机系统.算法.编译原理等等)的前提下,再考虑去进行下面的学习.第一部分:对于尚未做过Java工作的同学,包括一