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 脑图:
相关推荐
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。作为新手,了解JVM的工作原理和优化技巧是成为熟练Java开发者的重要步骤。以下是一些关于JVM的关键知识点: 1. **内存区域...
《深入理解JVM》(Inside the JVM) 是一本关于Java虚拟机的重要参考资料,它涵盖了JVM的内部工作原理,包括类加载机制、内存管理、字节码执行等核心概念。"gettingloaded.html" 可能是其中的一个章节,专门探讨了类的...
Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。本项目涉及的是一个简单的JVM实现,主要关注其基本的指令执行机制,包括入栈、出栈操作以及基本的加减运算和跳转功能。 首先,...
JVM(Java Virtual Machine)是Tomcat运行的基础,它的配置直接影响到Tomcat的性能、稳定性和内存使用效率。"jvm.zip_jvm_knownobc_tomcat"这个压缩包包含了与优化Tomcat中的JVM设置相关的资料,主要关注如何有效...
了解JVM内存模型和垃圾回收机制对于Java开发人员来说非常重要,可以帮助解决内存溢出、性能瓶颈等问题,提升程序的稳定性和效率。通过深入学习这些概念,可以更好地理解和控制Java程序在运行时的行为。
JVM Hook是一种监控和调试技术,例如,通过Java代理(Java Agent)或者使用JVMTI(Java Virtual Machine Tool Interface)可以实现在JVM运行时对特定事件进行插桩,用于性能分析、日志记录、故障排查等目的。...
"Address already in use: JVM_Bind(端口冲突)" 是一个常见的Java错误,它发生在尝试绑定一个已经被其他进程使用的网络端口时。在Java应用程序中,比如使用Jetty这样的服务器,当我们试图启动一个新的服务器实例时...
通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...
特别是Java虚拟机(Java Virtual Machine,简称JVM)作为Java程序运行的基础,它的存在极大地促进了Java语言的跨平台特性和编程生态的繁荣。而随着编程语言和计算技术的不断进步,开发者们开始尝试用不同的编程语言...
JVM运行机制深入分析,适用于研究java开发的人员,想深入理解jvm
IBM JVM.rar_jvm_site:www.pudn.com 这个压缩包文件主要聚焦于IBM的Java虚拟机(JVM)的深入解析,尤其侧重于其内存管理和底层运作机制的探讨。Java虚拟机是Java程序执行的核心,它为Java应用程序提供了一个跨平台的...
《深入理解JVM虚拟机》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机的工作原理,帮助读者提升对Java程序运行机制的深入理解。这本书的第二版更是加入了更多最新的JVM特性,使得学习内容更加全面且...
Java虚拟机(JVM)是Java程序运行的核心,它负责解析和执行字节码,管理内存,以及实现各种运行时特性。在这个名为"JV-jvm_practice.zip"的压缩包中,你将找到一系列关于JVM相关的代码示例,帮助你深入理解JVM的工作...
在Java开发中,掌握数据结构的知识可以帮助开发者更好地理解程序的运行机制,优化程序性能。因此,“数据结构”这一标签反映了文件内容的深刻主题。 文件标题中的“Java_JVM_Spring技能树_学习笔记集合”指明了文件...
Java虚拟机(JVM)是Java平台的核心组成部分,它是Java程序的运行环境,负责执行字节码并管理内存、线程和类加载等。JVM使得Java具备了“一次编写,到处运行”的特性。在面试中,对JVM的理解深度往往能体现一个...
总结来说,JVM的运行机制是Java平台无关性的关键,它通过字节码和解释器实现了代码的跨平台执行,同时通过垃圾回收和内存管理提供了高效且安全的运行环境。理解JVM的工作原理对于优化Java应用性能、排查问题和开发...
Spring框架是Java世界中广泛使用的依赖注入和面向切面编程的框架,它的配置机制极大地简化了应用的初始化和管理。ServerConfig则可能是为特定服务器环境或服务提供的配置接口,它可以扩展Spring的配置能力,使得...
理解JVM指令集对于优化Java代码、调试问题以及深入理解Java平台的工作机制至关重要。 在实际开发中,开发者可以使用诸如`javap`这样的工具来查看编译后的字节码,从而分析和理解代码的底层执行逻辑。通过对JVM指令...
理解JVM的工作机制对于提升程序性能、排查问题和进行有效优化至关重要。JVM主要包含以下几个关键部分: 1. 类装载器(ClassLoader):负责加载类文件,将字节码转化为内存中的Class对象。类装载器分为引导类装载器...
"Address already in use: JVM_Bind"问题主要源于端口资源的冲突,理解TCP/IP协议中关于端口的管理机制以及Java的`ServerSocket`类的工作原理,可以帮助我们有效解决这一问题。同时,掌握各种调试和排查工具,如查看...