文档章节

Java虚拟机jvm学习一:认识jvm的运行机制

silence88
 silence88
发布于 2017/02/26 17:45
字数 1211
阅读 30
收藏 1
点赞 0
评论 0

一、认识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)

  • 将字节码编译成机器码
  • 直接执行机器码
  • 运行时编译(也就是运行前先将字节码编译成机器码)
  • 编译后性能有数量级的提升

© 著作权归作者所有

共有 人打赏支持
silence88
粉丝 7
博文 71
码字总数 72855
作品 0
深圳
程序员
Java学习---Java简单认识

前言 小编在学习Java方面的基础知识,发现里面有很多是结合之前的语言的特点发展过来的,不同的地方是,Java有它自己的发展和特点。下面小编先简单地做一下总结,结合看过的1-2章的J2SE视频,...

m18633778874
04/01
0
0
JVM学习心得体会 (第一天)

Java虚拟机 Java虚拟机(Java Virtual Machine) 简称JVM Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还...

seng
2013/06/25
0
3
1.3.2 java程序的运行机制和jvm

java语言比较特殊,由java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(也就是*.class文件)。当然,这种字节码不是可执行...

Gooiem
2015/08/17
0
0
java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的
05/26
0
0
《Java从小白到大牛精简版》之第1章 开篇综述

Java诞生到现在已经有20多年了,但是Java仍然是非常热门的编程语言之一,很多平台中使用Java开发。表1-1所示的是TIOBE社区发布的2016年5月和2017年5月的编程语言排行榜,可见Java语言的热度,...

tony关东升
06/26
0
0
JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助。 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区:堆...

-蒋全忠-
2015/05/15
0
0
My java——JVM(java 虚拟机)一

JVM是Java Virtual Machine(Java虚拟机)的缩写。一般我们在学习java中会用到很多缩写名称,如JRE、JDK、SDK、JAVA SE、JAVA EE、JAVA ME、JAVA FX、还有j2se、j2ee、javaee5,我勒个去!多...

tngou
2013/03/13
0
2
《深入理解Java虚拟机》之Java虚拟机内存结构(1)

这个是很重要的一个基础认识。 java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区。 Java虚拟机栈,本地方法栈和程...

lixiyuan
2014/04/10
0
1
大型互联网架构必备技术——性能调优专题

性能调优 深入内核,直击故障 ,拒绝蒙圈 性能优化如何理解 1、性能基准 2、什么是性能优化 3、衡量标准 JVM调优 1、Jvm虚拟机内存剖析 2、垃圾收集器 3、实战调优案例与解决方案 4、Jvm运行...

Java高级架构
04/15
0
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
9分钟前
0
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
30分钟前
0
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
44分钟前
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
56分钟前
0
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
0
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
0
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部