深入理解JVM-java虚拟机栈】的更多相关文章

身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 第二版(基于jdk1.7)所以想写一些观后心得,整理一些比较重点的内容,也加强自己对重点内容的记忆! 以下默认虚拟机为hotsport虚拟机 一.jvm内存模型 ① 程序计数器: 程序计数器为每个线程私有 作用可以理解为在虚拟机解析字节码时记录当前字节码的行号 占用的内存较小 是唯一一个不会发生内存…
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机,他终归要运行在物理机上 在操作系统中体现出来的也就是一个进程 操作系统会给他分配资源,割一块内存作为他的地盘 class文件是静态的,想要运行程序,JVM需要将class文件中的信息加载到加载到他的地盘 然后处理他可以处理的数据类型的数据   JVM将这块内存按照功能进行了更细的划分,不过终究是一个…
虚拟机栈概述 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 栈实现的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 有不少Java开发人员一提到Java内存结构,就会非常粗略度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack),这种划分方式直接继承自传统的C.C++程序的内存布局结构,在Java语言里就显得有些粗糙了,实际的内存区域划分要比这更复杂. 首先我们要明确…
Java 虚拟机可以看作一台抽象的计算机,如同真实的计算机,它也有自己的指令集和运行时内存区域. Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存(运行时内存区域)划分为若干个不同的数据区域. 如下图所示: 一.程序计数器 Program Counter Register 1.定义:程序计数器是当前线程所执行字节码的行号指示器. 2.线程私有内存的原因:Java 中的多线程是线程间轮流切换并需要 CPU 给予时间片的方式实现的.在任何一个确定的时刻,都只有一个线程在执行指令.为了…
虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 内存中的堆与栈 栈是运行时的单位,而堆是存储的单位1.栈解决程序的运行问题,即程序如何执行,或者说如何处理数据.堆解决的是数据存储的问题,即数据怎么放.放在哪儿. 2.一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块 3.栈空间存放 基本数据类型的局部变量,以及…
<深入理解 java 虚拟机> 读书扩展 作者:淮左白衣 写于 2018年4月13日16:26:51 目录 文章目录 java虚拟机栈是什么 特点 栈帧 局部变量表 什么时候抛出 `StackOverflowError` .`OutOfMemoryError` 异常 后记:本地方法栈 java虚拟机栈是什么 平时大家在说 JVM内存 的时候,最常见的说法就是:堆.栈,这种说法很浅显,这里大家理解的栈,就是我们今天讲的java虚拟机栈,或者可能只是虚拟机栈中的 局部变量表 部分: 特点 线程私有…
1.Java虚拟机栈 java方法执行时的内存模型 1.1 栈帧 每个方法都会在虚拟机栈中创建一个对应的栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 一个方法的调用到结束就对应这一个栈帧从虚拟机栈入栈到出栈. 1.2 局部变量表 存放编译期可知在方法中各种基本数据类型和对象的引用,基本数据类型直接存值(字面量),引用类型存指向对象的指针或者代表对象的句柄或者与对象位置有关的信息. 1.2.1 double long 型数值会占据2个局部变量空间(slot)其余数据类型只占一个.…
一 运行时数据区域 JVM在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间. 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支/循环/跳转/异常处理/线程恢复等基础功能都需要依赖…
针对JVM虚拟栈 和栈帧的操作 虚拟机栈: 栈元素是栈帧.方法调用,栈帧入栈,反之出栈. 栈帧:一个方法的运行空间. 1.局部变量表:方法定义的局部变量.方法的参数存在该表. 实例方法中有个隐含参数“this”,所以实例方法可以访问该类的实例变量和其他实例方法. 局部变量表中变量的存放顺序:this(如果是实例方法)=>参数(如果有)=> 定义的局部变量(如果有) slot是局部变量表中的空间单元,虚拟机规范规定: 1.32位之内的数据,用一个slot来存放,如int.short.float等…
虚拟机栈(java stack) 百度图片搜索里的动图搜索功能不错,可以搜索一些动图,展示操作数栈的操作过程,比较形象.这点google差点意思 虚拟机栈(jvm stacks)是线程独占的 里面是多个栈帧(frame)或叫方法帧(class里的每个方法独占一个栈帧,所以也可以称之为方法帧) 每个栈帧里包含:局部变量区/操作数栈/动态链接/方法的返回地址 示例 文件SimpleExample.java 1 class SimpleExample { 2 public static void ma…
PC Register介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息.CPU只有把数据装载到寄存器才能够运行 这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器会更贴切 作用: 用来存储指向下一条指令的地址,也即将要执行的指令代码.由执行引擎读取下一条指令 它是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域 在JVM规范中,每个线程都有它自己的程序计数器,是…
Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java本地方法栈的特征 线程私有 后进先出(LIFO)栈 作用是支撑Native方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 有一些虚拟机(如HotSpot)将Java虚拟机栈和本地方法栈合并实现 栈帧的概念和特征 Java虚拟机栈中存储的…
与程序计数器一样,Java虚拟机栈也是线程私有的,他的生命周期与线程相同.虚拟机栈描述的是Java执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息.每个方法被调用直至执行完成的过程,就对应一个虚拟机栈由入栈到出栈的过程. 局部变量表存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,long,double),对象引用(reference类型,他不同于对象本身,根据不同的虚拟机实现,它可能是一个指向…
1.Java虚拟机栈(Java Virtual Machine Stacks) 线程私有,它的生命周期与线程相同.描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表. 操作数栈.动态链接.方法出口等信息.每一个方法从调用直至执行完成的过程,对应着一个栈帧在虚拟机中入栈到出栈的过程. 有人会把Java内存区分为堆内存(Heap)和栈内存(Stack),这种分发太过粗糙,Java内存区域的划分实际上远比这个要复杂很多, 这种划分只是说…
背景:最近开始忙着找工作了,把需要储备的知识再整理总结一遍!关于JVM的总结,是转自下面的连接.结合<深入理解java虚拟机>,看起来有更清晰的认识. 转载自:http://blog.csdn.net/seu_calvin/article/details/51404589 0. 前言 Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性. 平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行.JVM屏蔽了与具体平台相关的信息,…
虚拟机 JRE由Java API和JVM组成,JVM通过类加载器(Class Loader)加类Java应用,并通过Java API进行执行. 虚拟机(VM: Virtual Machine)是通过软件模拟物理机器执行程序的执行器.最初Java语言被设计为基于虚拟机器在而非物理机器,重而实现WORA(一次编写,到处运行)的目的,尽管这个目标几乎被世人所遗忘.所以,JVM可以在所有的硬件环境上执行Java字节码而无须调整Java的执行模式. JVM的基本特性: 基于栈(Stack-based)的虚…
jvm 是Java Virtual Machine(Java虚拟机)的缩写,java 虚拟机作为一种跨平台的软件是作用于操作系统之上的,那么认识并了解它的底层运行逻辑对于java开发人员来说很有必要! 让我们来看看它一次编译,到处运行的牛叉之处! 废话不多说,先看看jvm的架构图(无论何时脑子里要有这样一张图): 总概 从这副架构图可以看出jvm由类装载器.运行时数据区.执行引擎.本地方法接口还有垃圾回收器构成;其中垃圾回收器作用在整个jvm内存中(主要作用在堆和方法区),所以图中没有具体体现,…
栈帧的内部结构 每个栈帧中存储着 1.局部变量表(Local Variables) 2.操作数栈(Operand Stack)(或表达式栈) 3.动态链接(Dynamic Linking)(或执行"运行时常量池"的方法引用)----深入理解Java多态特性必读!! 4.方法返回地址(Return Adress)(或方法正常退出或者异常退出的定义) 5.一些附加信息 其中部分参考书目上,称方法返回地址.动态链接.附加信息为帧数据区 局部变量表(Local Variables) 1.局部变…
Java Virtual Machine Stacks,线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型:每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变量表.操作数栈.动态链接.方法出口等信息.每一个方法的执行就对应着栈帧在虚拟机栈中的入栈,出栈过程. 局部变量表: 存放编译期可知的各种基本数据类型.对象引用类型和returnAddress类型(指向一条字节码指令的地址:函数返回地址). long.double占用两个局部变量控件Slot. 局部变…
1.1.1.1. -Xmn参数 参数-Xmn1m可以用于设置新生代的大小.设置一个较大的新生代会影响老生代的大小,因为这两者的总和是一定的,这个系统参数对于系统性能以及GC行为有很大的影响,新生代一般设置为整个堆空间的1/3到1/4左右最合适. 参数-XX:SurvivorRatio用来设置新生代中eden空间和from/to空间的比例,公式如下: -XX:SurvivorRatio=eden/from =eden/to 解释:from和to之间的两块区间内存是相等的.可以参考 java虚拟机…
0. 前言 Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性. 平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行.JVM屏蔽了与具体平台相关的信息,使程序可以在多种平台上不加修改地运行.Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行.因此实现Java平台无关性. 本文主要介绍JVM中的架构知识,转载请注明出处:http://blog.csdn.net/seu_calvin/article/detai…
作者:请叫我红领巾,转载请注明出处http://www.cnblogs.com/xxzhuang/p/7453746.html,简书地址:http://www.jianshu.com/p/b963b3c0ad53 一.写在前面 首先,本篇文章并没有涉及原理,而是在笔者撸了<深入理解Java虚拟机>好几遍的基础上讲解自己的经验,从一个新手到现在明白JVM是个什么玩意,怎么去理解和明白,讲解这样一个经验而已.这篇文章并对JVM并没有挖掘得很深,在下目前暂时也没有这个能力,只是以通熟易懂的方式,让读…
Java内存模型 主内存与工作内存 Java内存模型主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量(Variable)与Java编程中的变量略有区别,它包括实例变量/静态字段和构成数组对象的元素,不包括局部变量和方法参数(线程私有).为获得较好的执行效能,Java内存模型并没有限制执行引擎使用处理器的特定寄存器或缓存来和主内存进行交换,也没有限制即时编译器调整代码执行顺序这类权利. Java内存模型规定所有变量都存储在主存(Mai…
类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using) 卸载(Unloading) 其中前五个阶段即为类加载的全过程.在后面会进行详细的介绍.而验证.准备.解析3个部分统称为连接(Linking).这7个阶段的发生顺序如下图: 在上图中,加载.验证.准备.初始化和卸载这5个阶…
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器. HotSpot虚拟机的垃圾回收器 图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用.虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器. 概念理解 并发和并行这两个…
JVM 虚拟机栈 本地方法栈:本地方法(使用native关键词修饰的方法,是由JVM底层用C,C++实现的),运行这部份代码使用的栈就是本地方法栈…
Java虚拟机规范官方文档    …
原文地址:http://yhjhappy234.blog.163.com/blog/static/316328322011119111014657/ 使用说明< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> -XX:+<option> 启用选项 -XX:-<option> 不启用选项 -XX:<option>=<…
不同的参数配置对系统的执行效果有较大的影响,因此,我们有必要了解系统实际的运行参数. 1.1.1.1. -XX:+PrintVMOptions 参数-XX:+PrintVMOptions可以在程序运行时,打印虚拟机接受的命令行显式参数,输出如下: VM option '+PrintVMOptions' VM option '+PrintCommandLineFlags' 这两个参数我们并没有制定,而是虚拟机制定的两个参数. 1.1.1.2. -XX:+PrintCommandLineFlags…
- 与局部变量表一样,均以字长为单位的数组.不过局部变量表用的是索引,操作数栈是弹栈/压栈来访问.操作数栈可理解为java虚拟机栈中的一个用于计算的临时数据存储区.- 存储的数据与局部变量表一致含int.long.float.double.reference.returnType,操作数栈中byte.short.char压栈前(bipush)会被转为int.- 数据运算的地方,大多数指令都在操作数栈弹栈运算,然后结果压栈.- java虚拟机栈是方法调用和执行的空间,每个方法会封装成一个栈帧压入占…