JVM(一)运行机制

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修饰,可以适当增加深度。

时间: 2024-10-05 20:02:36

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

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

一.JVM启动流程 1.java虚拟机启动的命令是通过java +xxx(类名,这个类中要有main方法)或者javaw启动的. 2.执行命令后,系统第一步做的就是装载配置,会在当前路径中寻找jvm的config配置文件. 3.找到jvm的config配置文件之后会去定位jvm.dll这个文件.这个文件就是java虚拟机的主要实现. 4.当找到匹配当前版本的jvm.dll文件后,就会使用这个dll去初始化jvm虚拟机.获得相关的接口.之后找到main方法开始运行. 上面这个过程的描述虽然比较简单

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

上一次写了1.初步认识JVM -- JVM序列,今天接着记录写JVM的运行机制. 一.JVM启动流程 Java平台包括JVM以及Java语言,其中JVM也是运行在操作系统中的一个应用程序进程,那么也应该有自己的生命周期以及内存空间.一般情况下java或javac命令执行过程大概如下: 输入java(javac)命令 装载环境以及配置(根据当前路径和系统版本寻找jvm.cfg) 根据配置寻找定位并加载JVM.DLL 初始化JVM获得JNIEnv接口 找到main方法 注意在装载环境以及配置中首先查

Java基础8-浅谈java程序的运行机制与JVM运行

一.java程序的运行机制 Java开发的整个生命周期,可以概括为两个阶段:编译阶段和运行阶段. 1.编译阶段 ①程序员编写一个符合java语法的xx.java的源文件. ②使用javac.exe命令对以上的java源程序进行编译. ③若编译通过则生成一个xxx.class文件. 2.运行阶段 ①打开命令窗口,在命令窗口中使用java.exe命令运行java程序. 二.java虚拟机运行 如上图所示,java文件解释执行时会启动JVM(java虚拟机)来给程序划分内存区域并转换成计算机系统可以识

【转载】Java JVM 运行机制及基本原理

原博地址:https://zhuanlan.zhihu.com/p/25713880 JVM的基础概念 JVM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候JVM的作用就体现出来了,它负责把我们的程序翻译给系统"听",告诉它我们的程序需要做什么操作. 我们都知道Java的程序需要经过编译后,产生.Class文件,JVM才能识别并运行它,JVM针对每个操作系统

深入JVM虚拟机(二) JVM运行机制

深入JVM虚拟机(二) JVM运行机制 1 JVM运行机制 1.1 JVM启动流程 JVM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间.JVM工作原理和特点主要是指操作系统装入JVM,是通过jdk中Java.exe来完成通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置. 2.装载JVM.dll. 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例. 4.调用JNIEnv实例装载并处理class类. J

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

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

java基础---JVM内存管理以及内存运行机制学习总结

自己从网上搜资料拼接了一张JVM内存图:如下图所示: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的 方式去实 现),字节码解释器工作时就是通过改

java运行机制详细

JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. Java虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行. 1.为什么要使用Java虚拟机 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实

JVM垃圾回收机制总结(6) :透视Java的GC特性

1. 使用 System.gc() 可以不管JVM使用的是哪一种垃圾回收的算法,都可以请求 Java的垃圾回收. 在命令行中有一个参数-verbosegc可以查看Java使用的堆内存的情况,它的格式:java -verbosegc classfile class TestGC { public static void main(String[] args) { new TestGC(); System.gc(); System.runFinalization(); } } class TestG

Hadoop之 - 剖析 MapReduce 作业的运行机制(MapReduce 2)

在0.20版本及更早期的系列中,mapred.job.tracker 决定了执行MapReduce程序的方式.如果这个配置属性被设置为local(默认值),则使用本地的作业运行器.运行器在耽搁JVM上运行整个作业.它被设计用来在小的数据集上测试和运行MapReduce程序. 如果 mapred.job.tracker 被设置为用冒号分开的主机和端口对(主机:端口),那么该配置属性就被解释为一个jobtracker地址,运行器则将作业提交给该地址的jobtracker. Hadoop 2.x引入了