jvm指令学习笔记
- 格式:doc
- 大小:251.00 KB
- 文档页数:6
Java之JVM必备知识点1.JVM为什么可以跨平台JVM能跨计算机体系结构(操作系统)来执行Java字节码(JVM 字节码指令集),屏蔽可与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由JVM提供者来实现。
指令集:计算机所能识别的机器语言的命令集合。
每个运行中的java程序都是一个JVM实例。
2.描述JVM体系结构(1)类加载器:JVM启动时或者类运行时将需要的class加载到JVM 中。
每个被装载的类的类型对应一个Class实例,唯一表示该类,存于堆中。
(2)执行引擎:负责执行JVM的字节码指令(CPU)。
执行引擎是JVM的核心部分,作用是解析字节码指令,得到执行结果(实现方式:直接执行,JIT(just in time)即时编译转成本地代码执行,寄存器芯片模式执行,基于栈执行)。
本质上就是一个个方法串起来的流程。
每个Java线程就是一个执行引擎的实例,一个JVM 实例中会有多个执行引擎在工作,有的执行用户程序,有的执行JVM内部程序(GC).(3)内存区:模拟物理机的存储、记录和调度等功能模块,如寄存器或者PC指针记录器。
存储执行引擎执行时所需要存储的数据。
(4)本地方法接口:调用操作系统本地方法返回结果。
3.描述JVM工作机制机器如何执行代码:源代码-预处理器-编译器-汇编程序-目标代码-链接器-可执行程序。
Java编译器将高级语言编译成虚拟机目标语言。
JVM执行字节码指令是基于栈的架构,所有的操作数必须先入栈,然后根据操作码选择从栈顶弹出若干元素进行计算后将结果压入栈中。
通过Java编译器将源代码编译成虚拟机目标语言,然后通过JVM 执行引擎执行。
4.为何JVM字节码指令选择基于栈的结构JVM要设计成平台无关性,很难设计统一的基于寄存器的指令。
为了指令的紧凑性,让编译后的class文件更加紧凑,提高字节码在网络上的传输效率。
5.描述执行引擎的架构设计创建新线程时,JVM会为这个线程创建一个栈,同时分配一个PC 寄存器(指向第一行可执行的代码)。
狂神说Java--Java学习笔记(基础合集)笔记参考来源狂神说Java视频https:///video/BV12J41137hu 本篇笔记有点长,可以根据⽬录定位,建议配合视频学习。
预科什么是计算机1. 名称:Computer,全称电⼦计算机,俗称电脑。
2. 定义:能够按照程序运⾏,⾃动、⾼速处理海量数据的现代化智能电⼦设备。
3. 组成:由硬件和软件组成。
4. 形式:常见显⽰有台式计算机、笔记本计算机、⼤型计算机等。
5. 应⽤:科学计算、数据处理、⾃动控制、计算机辅助设计、⼈⼯智能、⽹络等领域。
硬件及冯诺依曼结构计算机硬件组成:CPU,主板,内存,电源,主机箱,硬盘,显卡,键盘、⿏标,显⽰器。
冯诺依曼结构软件及软件开发计算机软件Windows常⽤快捷键Alt+f4关闭窗⼝ Shift+Delete永久删除 ctrl+w⾃动保存死机:任务管理器结束进程基本的Dos命令打开CMD的⽅式1. 开始+系统+命令提⽰符2. win键+R+输⼊cmd (推荐使⽤)3. 在任意的⽂件夹下,按住Shift键+⿏标右击,打开命令⾏窗⼝4. 在资源管理器地址栏路径前⾯加 “cmd ”5. 管理员运⾏⽅式:命令提⽰符右键以管理员⾝份运⾏(最⾼权限运⾏)常⽤的Dos命令# 盘符切换 E:# 查看当前⽬录下所有⽂件 dir# 切换⽬录 cd /d E:\idea# 返回上⼀级⽬录 cd ..# 进⼊同级⽬录下的下⼀级⽬录 cd tmp(该⽬录下的⽂件名)# 清屏 cls (clear screen)# 退出终端 exit# 查看电脑当前IP地址 ipconfig# 打开计算器 calc# 打开画图 mspaint# 新建记事本 notepad# 在当前⽬录新建⽂件夹 md test(⽂件夹名)# 新建⽂件 cd> a.txt(⽂件名)# 删除⽂件 del a.txt(⽂件名)# 删除⽬录 rd test(⽬录名)# ping命令(复制链接进⼊Dos直接单击⿏标右键粘贴)ping 计算机语⾔发展史第⼀代语⾔:机器语⾔第⼆代语⾔:汇编语⾔第三代语⾔:⾼级语⾔⾼级语⾔C、C++、Java、C#、Python、PHP、JavaScript …⼤体上分为:⾯向过程与⾯向对象两⼤类C语⾔是典型的⾯向过程的语⾔,C++,Java是典型的⾯向对象的语⾔Java⼊门Java帝国的诞⽣Java特性与优势简单性⾯对对象可移植性⾼性能分布式多态性多线程安全性健壮性Java三⼤版本Write Once,Run AnywhereJavaSE: 标准版 (桌⾯程序,控制台开发…)JavaME: 嵌⼊式开发 (⼿机,⼩家电…),已经凉了JavaEE: E企业级开发 (Web端,服务端开发…),JavaSE为基础JDK JRE JVMJDK:Java Development Kit (Java开发者⼯具,包括 JRE,JVM)JRE:Java Runtime Environment (Java运⾏时环境)JVM:Java Virtual Machine (Java虚拟机,跨平台核⼼)安装开发环境卸载JDk1. 删除Java安装⽬录2. 删除环境变量JAVA_HOME3. 删除path下关于JAVA的⽬录4. Java -version安装JDK1. 百度搜索JDK8,找到下载地址2. 同意协议,下载电脑对应的版本,如64位操作系统下载 jdk-8u281-windows-x64.exe3. 双击安装JDK4. 记住安装路径5. 配置环境变量1. 我的电脑-》属性-》系统⾼级设置-》环境变量2. 系统变量新建–> JAVA_HOME 输⼊对应的jdk安装路径3. path变量–>% JAVA_HOME%\bin6. 测试是否成功 cmd–>Java -versionJava基础注释1. 单⾏注释 //2. 多⾏注释 /* */3. ⽂档注释 /** */标识符和关键字Java 所有的组成部分都需要名字。
JVM内存机制-笔记内存管理来源:在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的对象,对于短周期的对象,需要频繁地进行垃圾回收以保证无用对象尽早被释放掉,对于长周期对象,则不需要频率垃圾回收以确保无谓地垃圾扫描检测。
为解决这种矛盾,Sun JVM的内存管理采用分代的策略。
Sun JVM有4垃圾回收器:∙Serial Collector[默认]:序列垃圾回收器,垃圾回收器对Young Gen和Tenured Gen都是使用单线的垃圾回收方式,对Young Gen,会使用拷贝策略避免内存碎片,对Old Gen,会使用压缩策略避免内存碎片。
基本上,在对内核的服务器上应该避免使用这种方式。
在JVM启动参数中使用-XX:+UseSerialGC启用Serial Collector。
∙Parallel Collector:并发垃圾回收器,垃圾回收器对Young Gen和Tenured Gen都是使用多线程并行垃圾回收的方式,对Young Gen,会使用拷贝策略避免内存碎片,对Old Gen,会使用压缩策略避免内存碎片。
在JVM启动参数中使用-XX:+UseParallelGC启用Parallel Collector。
∙Parallel Compacting Collector:并行压缩垃圾回收器,与Parallel Collector垃圾回收类似,但对Tenured Gen会使用一种更有效的垃圾回收策略,此垃圾回收器在暂停时间上会更短。
在JVM启动参数中使用-XX:+UseParallelOldGC启用ParallelCompacting Collector。
∙Concurrent Mark-Sweep (CMS) Collector:并发标志清除垃圾回收器,对Young Gen会使用与Parallel Collector同样的垃圾回收策略,对Tenured Gen,垃圾回收的垃圾标志线程与应用线程同时进行,而垃圾清除则需要暂停应用线程,但暂停时间会大大缩减,需要注意的是,由于垃圾回收过程更加复杂,会降低总体的吞吐量。
Jvm工作原理学习笔记一、JVM的生命周期1.JVM实例对应了一个独立运行的java程序它是进程级别a)启动。
启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static voidmain(String[] args)函数的class都可以作为JVM实例运行的起点b)运行。
main()作为该程序初始线程的起点,任何其他线程均由该线程启动。
JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程c)消亡。
当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出2.JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的二、JVM的体系结构1.类装载器(ClassLoader)(用来装载.class文件)2.执行引擎(执行字节码,或者执行本地方法)3.运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)三、JVM类加载器JVM整个类加载过程的步骤:1.装载装载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通过ClassLoader来完成类的加载,同样,也采用以上三个元素来标识一个被加载了的类:类名+ 包名+ClassLoader实例ID。
2.链接链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类。
完成校验后,JVM初始化类中的静态变量,并将其值赋为默认值。
最后对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError 等错误信息。
3.初始化初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发执行:调用了new;反射调用了类中的方法;子类调用了初始化;JVM启动过程中指定的初始化类。
JVM学习笔记一Java内存模型1、运行时数据区域1.1 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,可以看成是当前线程所执行的字节码的行号指示器。
字节码解释器工作时就是通过改变这个计数器的值来选取吓一跳需要执行的字节码指令。
线程私有,每条线程都需要有一个独立的程序计数器,各条线程之间互不影响,独立存储。
如果线程正在执行一个Java Method,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的Native Method,这个计数器的值为空(Undefined)。
此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError的区域。
1.2 Java虚拟机栈Java虚拟机栈(Java Virtual Machine Stacks)线程私有,生命周期与线程相同。
虚拟机栈描述的Java方法执行的内存模型: 每个方法在执行的同时,都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表存放了编译期可知的各种基本数据类型(boolean, byte, char, short, int, float, long ,double), 对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)其中64位长度的long,double类型的数据会占用2个局部变量空间(slot),其余的数据类型只占用1 个。
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,这个方法在运行期间不会改变局部变量表的大小。
JVM从零学习(六)堆1|0堆1|1堆的核心概述•一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。
•Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。
是JVM管理的最大一块内存空间。
o堆内存的大小是可以调节的。
•《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。
•所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区•《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当运行时分配在堆上。
•数组和对象可能永远不会存储在栈上,因为栈桢中保存引用,这个引用指向对象或者数组在堆中的位置。
•在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。
•堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域。
1|0内存细分现代垃圾收集器大部分基于分代收集理论设计,堆空间细分为:•Java 8 及以后堆内存逻辑上分为三部分:新生代、老年代、元空间o Young Generation Space 新生代 Young/New▪又被划分为Eden区和Survivor区o Tenure Generation Space 老年代 Old/Tenureo Meta Space 元空间 Metao1|2堆空间大小设置•Java堆区用于存储Java对象实例,那么堆的带下在JVM启动时就已经设定好了,可以通过选项“-Xmx” 和“-Xms”来进行设置。
o“-Xms”用于表示堆区的初始内存,等价于-XX:InitialHeapSizeo“-Xmx”用于表示堆区的最大内存,等价于-XX:MaxHeapSize•一旦堆区中的内存大小超过“-Xmx”所指定的最大内存时,将会抛出OutOfMemoryError异常。
•通常会将-Xms和-Xmx设置相同的值,其目的是为了能够在Java垃圾回收机制清理完堆区后不需要重新分隔计算堆区大小,从而提高性能。
java关键字的实现原理java关键字的实现原理JVM内部的基本概念JVM的指令集本来这次应该讲讲ORM的几个框架,但是笔者还没有完全总结出来,所以这里先插入一次学习JVM的心得。
作为一个Java程序员,如果不了解JVM的工作原理,就很难从底层去把握Java语言和Java程序的运作机制。
这里先推荐一个最权威的讲解JVM的文档,大家只要查过Java API的可以在里面的一个叫“API, Language, and Virtual Machine Do cument”的标题下看到四个子标题,第一个是我们最熟悉的Java API Specification,很少会有人注意到第三和第四个子标题,分别是“The Java Language Specification”和“The Java Machine Specification”后面都带有(Download)字样,JVM的那个URL直接链接到/docs/books/vmspec/2nd-edition/这里地址。
我们可以下载到一份非常权威详细的讲解JVM原理的官方文档。
笔者业余时间花了1个星期来阅读,这里把自己的收获跟大家来分享一下,大概从这么几个方面来谈一谈:1. JVM的实现机制Java虚拟机就是一个小的计算机,有自己的指令集,有自己的文件系统,管理内部的表和数据,负责读取class文件里面字节码,然后转换成不同操作系统的CPU指令,从而使得Java程序在不同的操作系统上顺利的跑起来。
所以Window的JVM能把字节码转换成Window系统的指令集,Linux的 JVM 能把字节码转换成Linux系统的字节,同理还有Solaris,它们彼此之间是不能通用的。
最早一款的原型虽然是Sun公司开发的,但发展到现在其实任何厂商都可以自己去实现一个虚拟机,用来读取字节码转换成OS指令。
甚至我们可以认为JVM跟Java编程语言都没有关系,因为你自己哪怕用记事本写一串字节码,也可以让JVM来解析运行,只要你的字节码能通过JVM的验证。
java开发学习笔记GC/JVM/jiafu1115/article/details/7024323/zhguang/p/3257367.html#introductionHotSpot的GC机制。
运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器虚拟机栈区:也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和returnAddress ,在编译期间完成分配。
堆区,JAVA 堆,也称GC 堆,所有线程共享,存放对象的实例和数组,JAVA 堆是垃圾收集器管理的主要区域。
方法区:所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。
程序计数器:线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。
JVM堆(1) 新域:存储所有新成生的对象(2) 旧域:新域中的对象,经过了一定次数的GC循环后,被移入旧域(3)永久域:存储类和方法对象,从配置的角度看,这个域是独立的,不包括在JVM堆内。
默认为4M。
Java内存分配和回收的机制概括的说,就是:分代分配,分代回收。
对象将根据存活的时间被分为:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)新域会被分为3个部分:1.第一个部分叫Eden。
(伊甸园??可能是因为亚当和夏娃是人类最早的活动对象?)2.另两个部分称为辅助生存空间(幼儿园),我这里一个称为A空间(From sqace),一个称为B空间(To Space)“停止-复制(Stop-and-copy)”清理法(将Eden区和一个Survivor中仍然存活的对象拷贝到另一个Survivor中),绝大多数刚创建的对象会被分配在Eden区,其中的大多数对象很快就会消亡。
Eden区是连续的内存空间,因此在其上分配内存极快;最初一次,当Eden区满的时候,执行Minor GC,将消亡的对象清理掉,并将剩余的对象复制到一个存活区Survivor0(此时,Survivor1是空白的,两个Survivor总有一个是空白的);下次Eden区满了,再执行一次Minor GC,将消亡的对象清理掉,将存活的对象复制到Survivor1中,然后清空Eden区;将Survivor0中消亡的对象清理掉,将其中可以晋级的对象晋级到Old区,将存活的对象也复制到Survivor1区,然后清空Survivor0区;当两个存活区切换了几次(HotSpot虚拟机默认15次,用-XX:MaxTenuringThreshold控制,大于该值进入老年代,但这只是个最大值,并不代表一定是这个值)之后,仍然存活的对象(其实只有一小部分,比如,我们自己定义的对象),将被复制到老年代把所有对象组成一个集合,或可以理解为树状结构,,基于coping算法的垃圾收集就从根集中扫描活动对象,只要可以找到的都是活动对象,如果找不到,这个对象就是凋零的昨日黄花,应该被回收总结从上面的推导可以得出很多结论,下面是前辈的经验总结与自已的认识1.JVM堆的大小决定了GC的运行时间。
JVM,Java虚拟机基础知识新⼿⼊门教程(超级通熟易懂)⼀.写在前⾯ ⾸先,本篇⽂章并没有涉及原理,⽽是在笔者撸了《深⼊理解Java虚拟机》好⼏遍的基础上讲解⾃⼰的经验,从⼀个新⼿到现在明⽩JVM是个什么玩意,怎么去理解和明⽩,讲解这样⼀个经验⽽已。
这篇⽂章并对JVM并没有挖掘得很深,在下⽬前暂时也没有这个能⼒,只是以通熟易懂的⽅式,让读者理解JVM是个什么玩意。
下⾯开始我的讲解。
⼆.谁说⼈神不得相爱——Java的跨平台 理解Java的跨平台特性,是对JVM最直观的认识。
所谓的“⼀次编译,到处运⾏”,为什么C/C++ 却不能实现呢?这⼀类语⾔直接使⽤物理硬件(或者说操作系统的内存模型),那么不同系统之间的内存模型是不同的,⽐如说Linux和Window,这就意味,在Window编译好的代码,却不能在Linux上运⾏。
《深⼊理解Java虚拟机》记录说,Java虚拟机规范中试图定义⼀种Java内存模型(JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台上都能达到⼀致性的并发效果。
举个现实的例⼦,⼀个只会听说中⽂的⼈,要如何和⼀个只会听说英⽂的⼈交流,在Java的世界⾥,采⽤的⽅式即是给两边的⼈各配⼀名翻译官(JVM),所以,这就是为什么JVM要有window版本,也要有Linux版本。
众所周知,Java的程序编译的最终样⼦是.class⽂件,不同虚拟机的对每⼀个.class⽂件的翻译结果都是⼀致的。
⽽对于C/C++⽽⾔,编译⽣成的是纯⼆进制的机器指令,是直接⾯对计算机系统的内存,但是,java程序的编译结果是⾯向JVM,是要交付给JVM,让他再做进⼀步处理从⽽让计算机识别运⾏,这就是所谓的“屏蔽掉各种硬件和操作系统的内存访问差异”。
这⾥的特点⼜和⾯向对象推崇的⾯向接⼝有着不可描述的关系,我只需要有这么个规范,不需要去知道接触你的底层原理实现。
三.活在梦⾥的真实——虚拟机 JVM,全称Java Virtual Machine,英⽂为Java虚拟机,简单的探讨⼀下虚拟机这三个字,对后⾯的学习也是挺舒服的。
JVM内存机制资料笔记参考JDK5.0垃圾收集优化之--Don't Pause/calvinxiu/archive/2007/05/18/1614473.aspxJVM内存模型以及垃圾回收/xuwanbest/blog/item/0587d82f2c44a73d1e30892e.html对jvm内存的一些理解/midstr/archive/2008/09/21/230292.html了解JVM的内存管理与垃圾回收/jiaozhenqing/blog/item/f18b85d4c1063a07a08bb77e.htmlJava内存溢出的解决方案/yanghlcn/blog/item/029e7303917b528dd43f7cc3.htmlJava内存组成堆(Heap)运行时数据区域,所有类实例和数组的内存均从此处分配。
Java 虚拟机启动时创建。
对象的堆内存由称为垃圾回收器的自动内存管理系统回收。
组成News Generation(Young Generation即图中的Eden + From Space + To Space)Eden 存放新生的对象Survivor Space 两个存放每次垃圾回收后存活的对象Old Generation(Tenured Generation 即图中的Old Space)主要存放应用程序中生命周期长的存活对象非堆内存JVM具有一个由所有线程共享的方法区。
方法区属于非堆内存。
它存储每个类结构,如运行时常数池、字段和方法数据,以及方法和构造方法的代码。
它是在 Java 虚拟机启动时创建的。
除了方法区外,Java 虚拟机实现可能需要用于内部处理或优化的内存,这种内存也是非堆内存。
例如,JIT 编译器需要内存来存储从 Java 虚拟机代码转换而来的本机代码,从而获得高性能。
组成Permanent Generation(图中的Permanent Space)存放JVM自己的反射对象,比如类对象和方法对象native heapGC策略堆JVM采用一种分代回收 (generational collection) 的策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。