主要内容:1.图解对象分配过程,2.Minor GC、Major GC、Full GC,3.TLAB(线程私有缓存区域)1.图解对象分配过程 特殊情况 2.Minor GC、Major GC、Full GC 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为: 新生代收集(Minor GC/Young GC):只是新生代的垃圾收集 老年代收集(Major GC/Old GC):只是老年代的垃圾收集 混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集 整堆收集(Full
主要内容:1.堆的细分内存结构,2.设置堆内存大小与OOM,3.年轻代与老年代1.堆的细分内存结构 JDK 7以前: 新生区+养老区+永久区 Young Generation Space:又被分为Eden区和Survior区Young/New Tenure generation Space:Old/Tenure Permanent Space:Perm JDK 8以后: 新生区+养老区+元空间 Young Generation Space:又被分为Eden区和Survior
绝大部分 Java 程序员应该都见过 "java.lang.OutOfMemoryError: PermGen space "这个异常。这里的 “PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机
主要内容:本地方法栈本地方法栈 Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态拓展的内存大小。(在内存溢出方面是相同的) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新
主要内容:本地方法,为什么要使用Native Method,现状本地方法 简单来讲,一个Native Method就是一个java滴啊用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。 在定义一个native method时,并不提供实现体(有些像
主要内容:方法返回地址(Return Address),2.7 一些附加信息方法返回地址(Return Address) 存放调用该方法的PC寄存器的值。 一个方法的结束,有两种方式: 正常执行完成 出现未处理的异常,非正常退出 无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出时,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。 本质上,方法的
主要内容:动态链接(Dynamic Linking),2.5.2虚方法和非虚方法动态链接(Dynamic Linking) 每一个栈帧内部都包含一个指向运行时常量池或该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。比如invokedynamic指令 在Java源文件被编译成字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Refenrence)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是
主要内容:操作数栈(Operand Stack)操作数栈(Operand Stack) 栈 :可以使用数组或者链表来实现 每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以成为表达式栈 操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)或出栈(pop) 某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用他们后再把结果压入栈。(如字节码指令bipush操作) 比如
主要内容:2.虚拟机栈2.虚拟机栈 2.1概述 2.1.1 背景 由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 2.1.2 内存中的堆与栈 栈是运行时的单位,而堆是存储的单位 即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎
主要内容:01 内存,02 分区介绍,03 线程,2.1 JVM系统线程,1.程序计数器(PC寄存器)01 内存 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区) (图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区 02 分区介绍 java虚拟机定
主要内容:执行引擎概述,Java代码编译和执行过程,机器码、指令、汇编语言,解释器执行引擎概述 执行引擎是Java虚拟机的核心组成部分之一 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部 ,但字节码并不能够
主要内容:JVM架构图,1.类加载子系统作用,2.类加载器分类,3.双亲委派机制,4. 沙箱安全机制,5.其他JVM架构图 1.类加载子系统作用 类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识; ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 加载的类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是
ipush 放到操作数栈 istore 到本地变量表 div 除 getstatic #2->常量池中的#2 找到函数 符号引用转为直接引用 接下来是invokevirtual 最后肯定有一个return 这个实例还没有涉及到堆空间,如果涉及到堆空间的话很复杂,涉及引用变量
主要内容:1.JVM的位置,2.一些JVM,3.Android虚拟机 DVM,4.jvm结构整体,5.java代码执行流程,6.栈的指令集架构和寄存器的指令集架构,7.jvm生命周期1.JVM的位置 2.一些JVM SUN Classic Exact VM HotSpot VM :HotSpot指热点代码探测技术 BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一 IBM J9 Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方
主要内容:1.运行时数据区,3.Java堆,4.方法区(Method Area)1.运行时数据区 运行时数据区 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。每个区域都有各自的作用。 分析 JVM 内存结构,主要就是分析 JVM 运行时数据存储区域。JVM 的运行时数据区主要包括:堆、栈、方法区、程序计数器等。而 JVM 的优化问题主要在线程共享的数据区中:堆、方法区。 1. 程序计数器 程序计数器(Program Counter