`

jvm_0_JVM运行机制

    博客分类:
  • jvm
 
阅读更多

 

0 虚拟机:

 

a) 概念: 通过软件模拟具有完整硬件系统功能,并运行在一个完整隔离环境中的完整计算机系统

 

b) 有哪些虚拟机:

vmware,visual box: 此两者都是使用软件模拟物理CPU的指令集(即模拟的东西都是现实存在的,

eg: cpu. 硬盘 )

jvm: 特点是使用软件模拟java字节码的指令集

 

jvm: 主要定义了 二进制class文件 和 JVM指令集,仅仅是一个规范 一份文档,任何组织都可以根据这份规范做自己的实现。

 

java语言和jvm关系:两者相互独立的关系

 

 

1 JVM启动流程



 

 

2 JVM基本结构

 


 


2.1  PC寄存器(program counter,即程序计数器)

a) 每个线程拥有一个PC寄存器

b) 在每个线程创建时 创建对应的PC寄存器

c) PC寄存器的内容指向下一条指令的地址

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

 

 

2.2 方法区

a) 保存装载的类的信息( 1类的常量池 2字段,方法信息 3方法字节码)

 

2.3 堆

a) 和程序开发密切相关

b) 应用系统对象都保存在java堆中

c) 所有线程共享java堆

 

2.3 栈

a) 线程私有

b) 栈由一系列帧组成(java栈也叫做帧栈)

c) 帧保存一个方法的局部变量,操作数栈,常量池指针,操作数栈,返回地址等

d) 每一次方法调用创建一个帧,并压栈

 

 看下图,理解下静态方法和非静态方法下栈内数据:

 

 

 

 看下面递归调用下栈流程:

 



 

 

备注:

每一次方法调用,就会创建一个帧,添加到栈中,一直加到方法执行完毕或者帧栈满了(出现溢出)

如果方法调用结束,那么此方法对应的帧在栈中移除掉。

 

 

java没有寄存器这个概念,那么在参数传递的时候,依靠的是栈,也只能依靠栈。

下面看操作数依靠栈下操作流程:

public static int add(int a, int b) {
		int c = 0;
		c = a + b;
		return c;
	}

 



 

 

看如下堆和栈的案例:

/**
 * 测试小对象创建下 jvm默认使用策略
 * 1 运行时,使用参数
 * -server -Xmx10m -Xms10m
   -XX:+DoEscapeAnalysis -XX:+PrintGC
   直接打印出耗时
 * 2 运势时,使用参数
 * -server -Xmx10m -Xms10m
   -XX:-DoEscapeAnalysis -XX:+PrintGC
   打印结果如下:
   [GC 3424K->160K(10176K), 0.0001908 secs] gc回收耗时  0.0001908 secs 
[GC 3424K->160K(10176K), 0.0001868 secs] 原来3424K大小缩减成160K,目前对内存为10176K 
[GC 3424K->160K(10176K), 0.0001891 secs] ....
   参数表示 在小对象并有逃逸情况下,jvm会把对象创建(byte[] b = new byte[2];)放在堆上,并且因为内存不够造成不断
   使用GC来回收历史操作消耗的内存
   
   测试结论:
   a) 小对象,(一般几十bytes),创建时,在没有逃逸情况下,直接分配到栈上,随时用,用完在栈中随时回收,提高效率
   b) 大对象或者逃逸对象则无法在栈上创建
 *
 */
public class test2 {

	
	
	public static void main(String[] args) {

		long begin = System.currentTimeMillis();
		for(int i=0; i<100000000; i++){
			alloc();
		}
		long end = System.currentTimeMillis();
		System.out.println(end - begin);
		
	}
	 
	public static void alloc(){
		byte[] b = new byte[2];
		b[0] = 1;
	}

}

 

 

2.5 栈,堆,方法区交互:

 

public class appMain{
	
	public static void main(String[] args) {
		
		Sample test1 = new Sample("测试1");
		test1.printName();
		
	}
}


class Sample{
	private String name;
	public Sample(String name){
		this.name = name;
	}

	public void printName(){
		System.out.println(name);
	}
}

 

 

JVM 参数中,栈 堆 方法区, 相互之间关系:

栈对象指向堆中产生的内存区域,对象的方法则放在方法区中,由堆来引用

 

 

 

 

3 线程内存模型

 

a) 每一个线程都有自己的工作内存和主存。

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

c) 线程中更新的值是不能马上反应在其他线程中的,他们操作的都是各自的工作内存,然后在将各自的工作内存更新到主存中(这个更新会耗时造成时差,如果想让线程的更新立刻通知到别的线程知道,使用volatile)



 

 

4 线程可见性:

 

基于3中线程从工作内存同步数据变化到主内存(共享内存) 会有延迟,为了规避这种延迟,使用如下方式保证

线程之间数据变化的可见性(线程修改了变量,别的线程立马就知道)

 

a) volatile

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

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

 

5 线程有序性:

 

a) 本线程内,操作都是有序

b) 线程外观察,操作都是无序


 

 

 

 

4 编译和解释运行的概念

 

  解释运行
解释执行以解释方式运行字节码
解释执行的意思是:读一句执行一句


编译运行(JIT)
将字节码编译成机器码
直接执行机器码
运行时编译
编译后性能有数量级的提升(保守估计会比解释运行效率高10辈)

 

 

 

5 脑图:



 


 

 

 

 

  • 大小: 23.8 KB
  • 大小: 61.5 KB
  • 大小: 60.9 KB
  • 大小: 86.4 KB
  • 大小: 64.7 KB
  • 大小: 7.9 KB
  • 大小: 83.3 KB
  • 大小: 45.7 KB
  • 大小: 113.7 KB
分享到:
评论

相关推荐

    jvm_jvm新手_jvm_

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。作为新手,了解JVM的工作原理和优化技巧是成为熟练Java开发者的重要步骤。以下是一些关于JVM的关键知识点: 1. **内存区域...

    inside_jvm.rar_Inside the JVM_gettingloaded.html_inside jvm_insi

    《深入理解JVM》(Inside the JVM) 是一本关于Java虚拟机的重要参考资料,它涵盖了JVM的内部工作原理,包括类加载机制、内存管理、字节码执行等核心概念。"gettingloaded.html" 可能是其中的一个章节,专门探讨了类的...

    JVM.rar_jvm_jvm 实现

    Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。本项目涉及的是一个简单的JVM实现,主要关注其基本的指令执行机制,包括入栈、出栈操作以及基本的加减运算和跳转功能。 首先,...

    jvm.zip_jvm_knownobc_tomcat

    JVM(Java Virtual Machine)是Tomcat运行的基础,它的配置直接影响到Tomcat的性能、稳定性和内存使用效率。"jvm.zip_jvm_knownobc_tomcat"这个压缩包包含了与优化Tomcat中的JVM设置相关的资料,主要关注如何有效...

    jvm_gc.rar_jvm_垃圾回收

    了解JVM内存模型和垃圾回收机制对于Java开发人员来说非常重要,可以帮助解决内存溢出、性能瓶颈等问题,提升程序的稳定性和效率。通过深入学习这些概念,可以更好地理解和控制Java程序在运行时的行为。

    JVM.rar_java 工作流_java 虚拟机_jvm_jvm hook_虚拟机 Java

    JVM Hook是一种监控和调试技术,例如,通过Java代理(Java Agent)或者使用JVMTI(Java Virtual Machine Tool Interface)可以实现在JVM运行时对特定事件进行插桩,用于性能分析、日志记录、故障排查等目的。...

    Address already in use: JVM_Bind(端口冲突)

    "Address already in use: JVM_Bind(端口冲突)" 是一个常见的Java错误,它发生在尝试绑定一个已经被其他进程使用的网络端口时。在Java应用程序中,比如使用Jetty这样的服务器,当我们试图启动一个新的服务器实例时...

    JVM_GC调优

    通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...

    JVM运行机制深入分析

    JVM运行机制深入分析,适用于研究java开发的人员,想深入理解jvm

    IBM-JVM.rar_jvm_site:www.pudn.com

    IBM JVM.rar_jvm_site:www.pudn.com 这个压缩包文件主要聚焦于IBM的Java虚拟机(JVM)的深入解析,尤其侧重于其内存管理和底层运作机制的探讨。Java虚拟机是Java程序执行的核心,它为Java应用程序提供了一个跨平台的...

    jvm_code深入理解.zip

    《深入理解JVM虚拟机》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机的工作原理,帮助读者提升对Java程序运行机制的深入理解。这本书的第二版更是加入了更多最新的JVM特性,使得学习内容更加全面且...

    jvm相关代码仓库,包括类加载机制,字节码执行机制,JVM内存模型,GC垃圾回收,JV-jvm_practice.zip

    Java虚拟机(JVM)是Java程序运行的核心,它负责解析和执行字节码,管理内存,以及实现各种运行时特性。在这个名为"JV-jvm_practice.zip"的压缩包中,你将找到一系列关于JVM相关的代码示例,帮助你深入理解JVM的工作...

    JVM.pdf_jvm_

    Java虚拟机(JVM)是Java平台的核心组成部分,它是Java程序的运行环境,负责执行字节码并管理内存、线程和类加载等。JVM使得Java具备了“一次编写,到处运行”的特性。在面试中,对JVM的理解深度往往能体现一个...

    JVM的运行机制

    总结来说,JVM的运行机制是Java平台无关性的关键,它通过字节码和解释器实现了代码的跨平台执行,同时通过垃圾回收和内存管理提供了高效且安全的运行环境。理解JVM的工作原理对于优化Java应用性能、排查问题和开发...

    util-jvm_2.9.2-6.13.2.zip

    Spring框架是Java世界中广泛使用的依赖注入和面向切面编程的框架,它的配置机制极大地简化了应用的初始化和管理。ServerConfig则可能是为特定服务器环境或服务提供的配置接口,它可以扩展Spring的配置能力,使得...

    JVM.rar_jvm_虚拟机

    理解JVM指令集对于优化Java代码、调试问题以及深入理解Java平台的工作机制至关重要。 在实际开发中,开发者可以使用诸如`javap`这样的工具来查看编译后的字节码,从而分析和理解代码的底层执行逻辑。通过对JVM指令...

    jvm_code-master.rar

    理解JVM的工作机制对于提升程序性能、排查问题和进行有效优化至关重要。JVM主要包含以下几个关键部分: 1. 类装载器(ClassLoader):负责加载类文件,将字节码转化为内存中的Class对象。类装载器分为引导类装载器...

    JVM_工作原理.

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的工作原理,包括内存管理、类加载机制、垃圾回收以及指令执行等方面。 首先,我们来看JVM的内存结构。...

    JVM性能调优-JVM内存整理及GC回收.pdf_java_jvm_

    《JVM性能调优——JVM内存整理及GC回收》是针对Java开发人员的重要主题,尤其是在大型企业级应用中,确保JVM(Java虚拟机)的高效运行是至关重要的。本资料深入探讨了如何通过调整JVM内存设置和优化垃圾回收机制来...

    JVM、GC详解及调优_jvm_JVM、GC详解及调优_

    本文将根据提供的信息,深入阐述JVM的工作原理,GC的机制以及如何进行JVM的性能调优。 首先,JVM是Java语言的核心组成部分,它为Java程序提供了运行时环境。JVM的主要任务是执行字节码,确保跨平台的兼容性。JVM的...

Global site tag (gtag.js) - Google Analytics