一、认识jvm

JVM是Java Virtual Machine的简称。意为Java虚拟机

虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统

例如:VMWare、Visual Box、JVM

VMWare或者Visual Box都是使用软件模拟物理CPU的指令集

JVM使用软件模拟Java 字节码的指令集

JVM的编译:

javap -c的指令是将一段二进制代码转换为汇编的格式。

二、JVM运行机制

JVM启动流程

JVM基本结构

类加载器系统:classloader将class文件加载到jvm的内存空间中

本地方法栈:native标识的方法

pc寄存器:每个线程拥有一个pc寄存器,在线程创建时创建,指向下一条指令的地址。

方法区:主要保存的就是类的相关信息,类型的常量池,字段、方法信息,方法字节码。通常和永久区关联在一起。

java堆:

1、和程序开发密切相关

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

3、所有线程共享Java堆

4、对分代GC来说,堆也是分代的

5、GC的主要工作区间

java栈:

1、线程私有

2、栈由一系列帧组成(因此Java栈也叫做帧栈)

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

4、每一次方法调用创建一个帧,并压栈

图说明:上方右边显示了100+98的过程,数据利用操作数栈临时保存。

Java栈 – 栈上分配

1、小对象(一般几十个bytes),在没有逃逸的情况下(栈是线程私有的,如果对于全局的变量就不能分配在栈上),可以直接分配在栈上

2、直接分配在栈上,可以自动回收(不需要GC清理),减轻GC压力

3、大对象或者逃逸对象无法栈上分配。

jvm内存模型

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

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

1、当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;第二,由工作内存执行的相应的load操作;当数据从工作内存拷贝到主内存时,也出现两个操作:第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作

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

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

volatile的说明:

public class Test extends Thread {

private volatile boolean stop = true;

public void stopme() {

stop = false;

}

@Override

public void run() {

int i = 0;

while (stop) {

i++;

}

System.out.println("停止" + i);

}

public static void main(String[] args) throws InterruptedException {

Test t = new Test();

t.start();

Thread.sleep(1000);

t.stopme();

}

}

上述代码的运行结果是:线程会结束。如果stop变量不使用volatile声明,则不会结束,因为线程永远适用的是拷贝到自己工作空间的值,而这个stop标识一直为true。

可见性:

一个线程修改了变量,其他线程可以立即知道

保证可见性的方法:

volatile

synchronized (unlock之前,写变量值回主存)

final(一旦初始化完成,其他线程就可见)

有序性:

在本线程操作内,操作都是有序的;(从结果看保证的结果是一致的)

而在线程外,操作都是无序的。产生这个的原因是指令重排或者主内存同步延时。

指令重排的基本原则

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

2、volatile规则:volatile变量的写,先发生于读

3、锁规则:解锁(unlock)必然发生在随后的加锁(lock)前

4、传递性:A先于B,B先于C 那么A必然先于C

5、线程的start方法先于它的每一个动作

6、线程的所有操作先于线程的终结(Thread.join())

7、线程的中断(interrupt())先于被中断线程的代码

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

字节码运行的两种方式:

解释运行

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

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

编译运行(JIT)

将字节码编译成机器码

直接执行机器码

运行时编译(也就是运行前先将字节码编译成机器码)

编译后性能有数量级的提升

如何 方法内指令重排 进制_Java虚拟机jvm学习一:认识jvm的运行机制相关推荐

  1. 如何 方法内指令重排 进制_谈谈指令重排

    这个知识点也是很多人说不清道不明的地方,感觉都知道,说又说不出来.为什么会这样呢?因为这几个字,很容易被当成动词去理解,其实正确的理解是当成名词,即指令重排现象.那什么时候会产生指令重排现象呢?两个阶 ...

  2. java 8位16进制_Java二、八、十、十六进制介绍

    1.说明 在Java中整数有四种表示方式, 分别为十进制,二进制,八进制,十六进制, 其中十进制就是平常最熟悉,使用最多的进制: 二进制是在计算机中使用最多的进制, 八进制和十六进制都是基于二进制的, ...

  3. 内置的进制转换的方法---小笔记

    10进制转换成16进制:Integer.toHexString(int i) 10进制转换成8进制:Integer.toOctalString(int i) 10进制转换成2进制:Integer.to ...

  4. java读取文件 16进制_Java对文件的16进制读取和操作

    大家可以参考一下源代码的相关部分注释,然后写出自己的16进制处理程序. 有几个重点地方: 16进制字符串->10进制数          int input = Integer.parseInt ...

  5. java字节数组转换成16进制_Java 将字节数组转化为16进制的多种方案

    很多时候我们需要将字节数组转化为16进制字符串来保存,尤其在很多加密的场景中,例如保存密钥等.因为字节数组,除了写入文件或者以二进制的形式写入数据库以外,无法直接转为为字符串,因为字符串结尾有\0,当 ...

  6. java 16进制_JAVA十六进制数据接收与传输

    由于项目中经常遇到与设备进行交互获取数据,不仅有Python版本.还有Java版本,还可能会有C#版本,在此做个记录. 一.十六进制转换工具类 主要包含十六进制字符串转ASCII,ASCII转十六进制 ...

  7. python十进制转八进制_Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)...

    使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x) Convert an integer num ...

  8. java 16进制字符转10进制_java 16进制字符串怎么转换成10进制字符串

    展开全部 toHexString public static String toHexString(int i)以十六进制的无符号整数形式返回一个整数参数的字符串表示形式. 如果参数为负,那么无符号整 ...

  9. python 自定义进制转换,Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)...

    使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x) Convert an integer num ...

最新文章

  1. android 常用小功能(第二版)
  2. 圆桌的项目Alpha冲刺——测试
  3. 摆脱困境:将运行时配置作为JSON返回
  4. 服务器是多用户服务的计算机,Win10权限管理与多用户远程登录(多方案)
  5. Android学习笔记:短信控制手机之“短信开启定位”
  6. iview图表_iview踩坑
  7. python的基础 杂项(十四)
  8. 熬夜整理出30张可视化大屏模板,不敲一个代码就能直接套用
  9. cdn厂商 同兴万点_CDN牌照哪家强?阿里、腾讯牌照差异竟如此之大
  10. 6月全球垃圾邮件上升6.9% 以色列高居榜首
  11. Java小程序:单循环比赛,总分高者获胜的源代码
  12. word如何添加艺术字体
  13. Java实现阿里云域名动态解析,DDNS功能
  14. 详细解析STM32的时钟系统
  15. Excel - 自动填充
  16. 直流输电模型基于pscad仿真软件的3端直流输电模型
  17. telnet不是内部或者外部命令也不是可运行的程序
  18. 宝钢大型高炉控制中心介绍
  19. ubuntu版本Linux系统中安装jira
  20. 计算机系统的备份与还原实验报告,数据备份与数据恢复实验报告

热门文章

  1. 你真的会使用Eclipse的debug吗?
  2. Jsp+Servlet+Mysql实现的在线鲜花商城源码
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生社团管理系统
  4. 在windows平台下搭建Django项目虚拟环境
  5. 智能蓝牙控制、温湿度控制时间风扇
  6. jquery常用事件——幕布
  7. NodeJs同步、异步加载
  8. div css左边固定右边自适应布局
  9. sql 获取第10到20个记录
  10. printf输出16进制数