JVM启动流程

1.java虚拟机启动的命令是通过java +xxx(类名,这个类中要有main方法)或者javaw启动的。

2.执行命令后,系统第一步做的就是装载配置,会在当前路径中寻找jvm的config配置文件。

3.找到jvm的config配置文件之后会去定位jvm.dll这个文件。这个文件就是java虚拟机的主要实现。

4.当找到匹配当前版本的jvm.dll文件后,就会使用这个dll去初始化jvm虚拟机。获得相关的接口。之后找到main方法开始运行。

上面这个过程的描述虽然比较简单,但是jvm的启动流程基本都已经涵盖在里面了。

jvm的基本结构

类加载器子系统就是通常我们所说的ClassLoader类加载器,首先我们会通过ClassLoader加载到jvm的内存中去,本地方法区主要就是native的方法调用,这个我们不前不做关心,

pc寄存器

1.每个线程拥有一个pc寄存器。
jvm会为每一个线程分配一个pc寄存器,这个pc寄存器总是会指向下一个指令的地址。这样程序在执行过程中pc寄存器总是会知道下一步会做什么。在执行本地方法的时候,pc寄存器的值总是未定义的。

方法区

方法区是用来保存类的原信息。用来描述类的信息,包括类型常量池,字段方法信息,方法字节码。在JDK6的时候字符串常量是放在方法区中,但是JDK7的时候就已经移到了堆中。所以从这方面来说方法区,堆中到底保存的是什么信息和jdk的版本有很大的关系。从一般意义上来说我们的方法区就是保存一些类的原信息。方法区通常和永久区(perm)关联在一起,保存一些相对稳定的数据,

java堆

1.java堆应该是和程序开发中最为密切的一个内存区间,我们在程序开发中通过new出来的对象基本上都是保存在java堆中。
2.堆是全局共享的,所有线程都共享java堆,也就是你创建了一个对象之后,所有的线程都是能够访问的。
3.从GC的角度看,java堆的结构和GC的算法是有关系的。

java栈

1.java栈和堆相比是线程私有的,栈是由一系列帧组成的,所以java栈也叫作帧栈。帧中保存的内容是一个方法的局部变量,操作数栈,常量池指针。每一次方法调用都会创建一个新的帧,并压栈。
我们来看一段C++代码
在上面代码中method()这个方法中,我们new了一个对象,那这个new的对象就是在堆上分配的,但是在堆上分配有一个问题就是每次我们new一个对象之后都要手动把这个对象去删除,释放内存。如果我们多次在堆上分配了对象空间,但是却忘记了删除对象,就会出现内存泄露,就是我们分配空间却没有删除。内存泄露在实际开发中是非常难以解决的问题,因为内存泄露有可能发生在任何地方。 
我们可以采用右面的方法,声明一个对象,我们像上面右面的方法中声明一个对象,那么他并没有实际的划分内存空间,而只是在java栈上产生了一个引用。而这个引用在我们使用后会自动释放,不会产生内存泄露的问题。

java栈上分配好处

栈上分配的一般都是比较小的对象,在没有逃逸(逃逸是指这个对象创建出来之后不仅仅只在当前线程中要使用,其他的线程也要调用的情况)的情况下,直接分配到栈上。GC可以自动回收,减轻GC的压力。大对象或者逃逸对象无法分配到栈上。
我们从上面的代码和主时中可以交互,一个程序要想执行是需要几个内存区域交互配合执行的。
从上面这个图中我们可以发现,每个线程读取和存储的都是线程的工作内存。而线程的工作内存再到主存中的存储是肯定会有一些时差的。也就是改变了一个变量的值之后,另一个调用这个变量的对象是不能马上知道的。如果说要让其他线程立即可见这个改动,就要使用volatile关键字修饰。一旦使用这个关键字之后,所有调用这个变量的线程就直接去主存当中拿取数据。
下面这个图就是线程和本地内存和主存之间的关系。
 
线程总是在自己的本地内存中拿取变量,而本地内存中存储的只是共享变量的一个副本,真正的共享变量是存储在主存中的。所以这个之间存在了一定的时延和误差。

可见性

可见性是指一个线程修改了变量之后,其他线程能够立即知道。
保证可见性的方法就是上图提到的三种方法。
 

有序性和指令重排

有序性:在一个线程当中,所有的指令,所有的操作都是有序的。但是在线程外观察,在多线程的情况下去观察前面一个线程的行为,我们会发现这个行为有可能就是无序的(这种无序有两种原因,一种就是指令重排,另一种就是主存同步的延时,也就是说在线程A中更改了一个变量的值,同步主存也成功了,但是在线程B中我们可能还没来得及去同步主存中的值,这个时候对于线程B来说线程A的操作可能就是无序的)。
指令重排的基本原则:
1.程序顺序原则,一个线程内保证语义的串行性。
2.volatile规则:volatile关键字变量的写是先发生于读的。
3.锁规则:解锁必然发生于随后的一个加锁之前。
4.传递性:A先于B,B先于C,那么A必然先于C。
5.线程的start方法先于它的每一个动作。
6.线程的所有操作先于线程的终结(Thread.join())。
7.线程的中断(interrupt())先于线程被中断的代码。
8.对象的构造函数执行结束于funlize()方法。

java之Jvm学习--JVM运行机制的更多相关文章

  1. JVM学习笔记-运行时数据区

    不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误 ...

  2. java 基础知识学习 JVM虚拟机参数配置

    1) 设置-Xms.-Xmx相等: 2) 设置NewSize.MaxNewSize相等: 3) 设置Heap size, PermGen space: Tomcat 的配置示例:修改%TOMCAT_H ...

  3. java入门(1) 程序运行机制及运行过程

    首先我们来看一下java程序在底层是怎么工作的: JAVA有两种核心机制: Java虚拟机(Java Virtual Machine): 1.java虚拟机可以理解成一个以字节码为机器指令的CPU. ...

  4. JVM学习--jvm监控和故障处理工具

    java虚拟机性能监控常用命令 Sun JDK监控和故障处理命令有jps.jstat.jinfo.jmap.jhat.jstack . 1.jps jps:JVM Process Status Too ...

  5. JVM学习-jvm结构(一)

    java是跨平台的语言.一次编译多端使用.究竟是如何实现的呢 1.首先编译器会将java 文件编译成class文件.然后在不同的平台使用对应的虚拟机.不同虚拟机的内装载系统将class文件转换平台能执 ...

  6. 探讨JVM运行机制和执行流程

    JVM是什么 概述 JVM是Java Virtual Machine的缩写.它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机. JVM屏蔽了具体操作系统平台的信息(显然,就像是我们在电脑上开了 ...

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

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

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

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

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

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

随机推荐

  1. Snagit for mac(截图软件)中文版,截个图就是这么容易!

    Snagit for mac是唯一具有内置高级图像编辑和屏幕录制功能的屏幕捕捉软件.它可以轻松抓取图像.文本和影音等多种内容形式,内置强大编辑器,捕捉.编辑一步到位.现为您带来Snagit for m ...

  2. spark DataFrame 读写和保存数据

    一.读写Parquet(DataFrame) Spark SQL可以支持Parquet.JSON.Hive等数据源,并且可以通过JDBC连接外部数据源.前面的介绍中,我们已经涉及到了JSON.文本格式 ...

  3. ImCash:韩国最大交易所遭遇至暗时刻:2018年亏损1.8亿美元

    Bithumb上个月遭到黑客攻击,随后要求用户小心存款,该公司报告称损失1.8亿美元(合2050亿韩元). 据<韩国时报>(Korea Times)报道:受到熊市影响,数字货币交易所实际交 ...

  4. Pytoch机器学习乱玩(一):数学建模作业,体重与心率

    动物心率与体重的模型 动物消耗的能量p主要用于维持体温,而体内热量通过其表面积S散失,记动物体重为w,则\(P \propto S \propto w^{\alpha}\).又\(P\)正比于血流量\ ...

  5. 【转】window.onerror跨域问题

    What the heck is "Script error"? Ben Vinegar/ May 17, 2016 If you’ve done any work with th ...

  6. xpath路径定位

    preceding-sibling选择同级层所有节点向前查找 //div[@id='id1']/preceding-sibling::div/a 例如:“更多产”超链接的同级向上数第二个元素,即“登陆 ...

  7. arp断网攻击

    arp断网攻击可以是同局域网内主机无法上网!(可恶搞室友哦,嘻嘻!) 实现原理 arp的中文释义是地址解析协议,全英文 address resolution protocol,是一个将局域网IP地址映 ...

  8. Python 3.5 filter

    filter(F, L) F: 函数.L:范围 filter的功能是:用函数F把L范围内的参数做过滤 通常和list一起使用,把过滤后的参数做成列表 list(filter(lambda n:not ...

  9. javascript js原生ajax post请求 实例

    HTML代码: 注意: xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencod ...

  10. JS浏览器兼容问题

    一.JS与DOM的兼容性: (一) DOM节点的访问: 1.以前对DOM节点访问一般用“document.All.元素ID属性值”或者“document.元素ID属性值”这种简化的方法,在FireFo ...