1.启动流程

2.JVM基本结构

PC寄存器

  》每个线程拥有一个PC寄存器

  》在线程创建时创建

  》指向下一条指令的地址

  》执行本地方法时,PC的值为undefined

方法区

保存装载的类的源信息

  》类型的常量池

  》字段、方法信息

  》方法字节码

  通常和永久区(Perm)关联在一起

Java堆

  》和程序开发密切相关

  》应用系统对象都保存在Java堆中

  》所有线程共享Java堆

  》对分代GC来说,堆也是分代的

  》GC的主要工作区间

Java栈

  》线程私有

  》栈由一系列帧组成(因此Java栈也叫帧栈)

  》帧保存一个方法的局部变量、操作数栈、常量池指针

  》每一次方法的调用会创建一个帧,并压栈

1.局部变量表 包含参数和局部变量

相对应的局部变量表

2.操作数栈

Java没有寄存器,所有参数传递使用操作数栈

3.栈上分配

  》小对象(一般几十个bytes),在没有逃逸的情况,可以直接分配在栈上

  》直接分配在栈上,可以自动回收,减轻GC压力

Java内存模型

  》每一个线程有一个工作内存和主存独立

  》工作内存存放主存中变量的值的拷贝

  数据从主内存--->工作内存

    主内存:read 工作内存:load

  数据从工作内存--->主内存

    工作内存:store 主内存:write

  每一个操作都是原子的,即执行期间不会被中断。

  对于普通变量,一个线程中更新的值,不能马上反应在其他变量中,如果需要在其它线程中立即可见,需要使用volatile关键字。

Java的有序性

  》在本线程中,操作都是有序的

  》在线程外观察,操作都是无序的(指令重排或主内存同步延时)

指令重排:在本线程内不能因执行的顺序先后结果发生改变,编译不考虑多线程

不能重排    a=1,b=a

      a=1,a=2

     a=b,b=1

可以重排    a=1,b=2

synchronized保证有序性

指令重排的基本原则

  》程序顺序原则:一个线程内保证语义的串行性

  》volatile规则

  》锁规则

  》传递性

  》线程的start()方法优先于它的每一个动作

  》线程的所有操作优于线程的终结

  》线程的中断先于被中断线程的代码

  》对象的构造函数执行结束先于finalize()方法

Java中字节码执行的两种方式

解释运行

  》解释执行以解释方式运行字节码

  》解释执行的意思是:读一句执行一句

编译运行(JIT)

  》将字节码编译成机器码

  》直接执行机器码

  》运行时编译

  》编译后性能由数量级的提升

问题思考:你能想到有什么办法,可以让一个程序的函数调用层次变的更深。比如,你在一个递归调用中,发生了stack的溢出,你可以做哪些方面的尝试,使系统尽量不溢出?阐述你的观点和原因。

答:

首先了解到线程在调用每个方法的时候,都会创建相应的栈,在退出方法的时候移出栈桢,并且栈是私用的,也需要占用空间,所以让一个程序的函数调用层次变的更深
减少栈占的空间很必要。或者增大线程的线的大小。
通过volatile增加调用层次深度。线程会对一个没有volatile的变量进行临时存储,这就导致线程栈的空间增大,如果对一个变量增加volatile修饰,可以适当增加深度。

JVM(一)运行机制的更多相关文章

  1. JVM虚拟机运行机制

    JVM虚拟机运行机制 什么是JVM?虚拟机是物理机器的软件实现.Java是用在VM上运行的WORA(Write Once Run Anywhere)概念而开发的.编译器将Java文件编译为Java . ...

  2. Java虚拟机(一):JVM的运行机制

    一.JVM启动流程 通过java +xxx(或javaw)启动java虚拟机 装载配置,会在当前路径中寻找jvm的config配置文件. 根据查找jvm.dll文件.这个文件就是java虚拟机的主要实 ...

  3. 2.JVM运行机制 -- JVM序列

    上一次写了1.初步认识JVM -- JVM序列,今天接着记录写JVM的运行机制. 一.JVM启动流程 Java平台包括JVM以及Java语言,其中JVM也是运行在操作系统中的一个应用程序进程,那么也应 ...

  4. java虚拟机运行机制

    转自java虚拟机运行机制 首先简单阐述下解释型语言和编译型语言的联系与区别. 编译型语言是通过编译器将程序编译成目标机器所能识别的机器码,而解释型语言不需要编译过程.由该语言的解释器读取脚本,按照语 ...

  5. JVM学习(1)——通过实例总结Java虚拟机的运行机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...

  6. 《疯狂Java讲义》(二)---- Java程序的运行机制和JVM

    1. 运行机制 Java源文件(*.java)-----使用javac编译----编译成*.class文件----使用java解释执行----特定平台的机器码 2. 原理 负责解释执行字节码文件的就是 ...

  7. jvm运行机制与内存管理

    http://blog.csdn.net/lengyuhong/article/details/5953544 http://www.cnblogs.com/nexiyi/p/java_memory_ ...

  8. 深入解析java虚拟机-jvm运行机制

    转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...

  9. JVM学习(1)——通过实例总结Java虚拟机的运行机制(转)

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: JVM的历史 JVM的运行流程简介 JVM的组成(基于 Java 7) JVM调优参数:-Xmx和-Xms ...

  10. JVM学习001通过实例总结Java虚拟机的运行机制

    JVM学习(1)——通过实例总结Java虚拟机的运行机制-转载http://www.cnblogs.com/kubixuesheng/p/5199200.html 文章转载自:http://www.c ...

随机推荐

  1. 006---Linux用户、群组和权限

    用户.组.权限管理 用户管理 增 语法:useradd -c '添加用户1' user1 选项和参数: -c:用户的备注信息 -d:用户的家目录 -g:指定用户所属的用户组(gid) -s:指定用户登 ...

  2. nexys4开发板使用-第一篇(未完成)

    1. 下去下个原理图.今天准备研究下DDR的控制,看介绍新一代的Nexys 4 DDR最值得被关注的改良是将原先的16 MiBCellularRAM升级为128 MiB的DDR2 SDRAM内存.Di ...

  3. Python 集合内置函数大全(非常全!)

    Python集合内置函数操作大全 集合(s).方法名 等价符号 方法说明 s.issubset(t) s <= t 子集测试(允许不严格意义上的子集):s 中所有的元素都是 t 的成员   s ...

  4. Python零基础入门必知

    Python自学知识点总结 //2018.10.09 1. Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido ...

  5. TPO-15 C1 The campus newspaper's reporter position

    TPO-15 C1 The campus newspaper's reporter position 第 1 段 1.Listen to a conversation between a Studen ...

  6. Django2.1新手图文入门教程

    第一个django Web Django2.1新手图文入门教程 http://www.liujiangblog.com/blog/36/

  7. POJ 3256 (简单的DFS)

    //题意是 K N, M; //有K个牛 N个牧场,M条路 ,有向的  //把K个牛放到任意的n个不同牧场中,问所有牛都可以到达的牧场数的总和  //这是一道简单的DFS题 //k 100 //n 1 ...

  8. day-18 滑动平均模型测试样例

    为了使训练模型在测试数据上有更好的效果,可以引入一种新的方法:滑动平均模型.通过维护一个影子变量,来代替最终训练参数,进行训练模型的验证. 在tensorflow中提供了ExponentialMovi ...

  9. day-15 用opencv怎么扫描图像,利用查找表和计时

    一.本节知识预览 1.  怎样遍历图像的每一个像素点? 2.  opencv图像矩阵怎么被存储的? 3.  怎样衡量我们算法的性能? 4.  什么是查表,为什么要使用它们? 二.什么是查表,为什么要使 ...

  10. python leveldb 文档

    标签(空格分隔): python leveldb import leveldb db = leveldb.LevelDB('./db') db.Put('hello', 'world') print ...