随笔分类 - Java虚拟机
摘要:硬件设备 处理器的运算速度很快,但是处理器又要和内存打交道,读取运算数据、存储运算结果的过程很缓慢,此时需要一个高速缓存,运算时将数据复制到缓存中,运算完成后将结果同步会内存,处理器无需等待内存读写加快速度。但是会产生缓存一致性问题,需要依赖一定的协议。“内存模型”可以理解为在特定的协议下,对特定的
阅读全文
摘要:引言 方法调用不是方法执行而是确定执行哪个方法。 解析 所有方法调用中的目标方法都是常量池中的一个符号引用,在类加载的解析阶段会将一部分符号引用转化为直接引用(方法入口地址),前提是方法在程序运行之前有明确的调用版本且运行期不可改变。这类方法的调用称为解析。 被invokestatic、invoke
阅读全文
摘要:引言 执行引擎在执行Java代码时可能会有解释执行(解释器执行)和编译执行(JIT产生本地代码执行)。 运行时栈帧结构 栈帧存储了局部变量表、操作数栈、动态链接、方法返回地址。执行引擎运行的所有字节码指令都只针对虚拟机栈顶的栈帧而言。 局部变量表 局部变量表(Local Variable Table
阅读全文
摘要:引言 类加载器工作在加载阶段,将二进制字节流(如从Class文件中获取)加载到内存中并生成对应的java.lang.Class对象。 类的唯一标识 类的唯一标识是指同一类(类的全限定名相同)被同一个类加载器加载,判断两个类是否相等除了比较全限定名是否相同还要判断两个类是否被同一个类加载器加载。 输出
阅读全文
摘要:引言 类加载的全过程分为5个阶段:加载,验证,准备,解析,初始化。 加载 加载阶段虚拟机需要完成3件事: 1)通过一个类的全限定名来获取定义此类的二进制字节流,获取方式很多种如Class文件、网络、运行时计算生成等。 2)将这个字节流代表的静态存储结构转化为方法区的运行时数据结构。 3)在内存中生成
阅读全文
摘要:引言 虚拟机把描述类的数据即Class文件加载到内存中,并对数据进行验证、转换解析和初始化,最终形成可以直接被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类的生命周期 类初始化的时机 第一个阶段加载是由虚拟机控制,对于初始化阶段,虚拟机严格要求有且只有5种情况触发初始化。 1)遇到ne
阅读全文
摘要:引言 Java虚拟机的指令是由一个字节长度的代表着某种特定操作含义的数字(操作码)以及跟在其后零至多个操作所需参数(操作数)构成。 加载和存储指令 该类指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。 将一个局部变量加载到操作数栈顶:iload,iload_<n>等,其中iload的前四个
阅读全文
摘要:引言 Class文件格式采用伪结构来存储数据,该伪结构有两种数据类型:无符号数和表。 无符号数是基本数据类型,以u1、u2、u4、u8表示1个字节、2个字节、4个字节、8个字节的无符号数。无符号数用来描述数字、索引引用、数量值或按UTF-8编码构成的字符串值。 表是由多个无符号数或其他表作为数据项构
阅读全文
摘要:JConsole Java监视与管理控制台 启动JConsole 通过jdk/bin/下的“jconsole.exe”来启动,启动后将搜索出本机运行的所有虚拟机进程,不需要再使用 jps 来查询。双击进程即可开始监控。 概览页显示的是虚拟机运行时的情况,包括“堆内存使用量”、“线程”、“类”、“CP
阅读全文
摘要:JDK监控和故障处理工具 jps 虚拟机进程状况工具 列出正在运行的虚拟机进程,虚拟机执行主类(main函数所在的类)名称和这些进程的本地虚拟机唯一ID(LVMID)。 jps命令格式 jps [ options ] [ hostid ] jstat 虚拟机统计信息监视工具 可以显示本地或者远程虚拟
阅读全文
摘要:对象优先在Eden分配 大多数情况下,对象会在新生代Eden区中分配,当Eden区中没有足够空间时,虚拟机将发起一次Minor GC。 运行结果 eden space 8192K:新生代Eden区 from space 1024K:新生代from survivor区 to space 1024K:新
阅读全文
摘要:产生GC日志的参数 -XX:+PrintGCDetails GC日志格式 GC和Full GC是指回收的停顿类型,Full GC说明发生了“Stop The World”。 “[DefNew”、“[Tenured”、“[ParmNew”、“[PSYoungGen”表示GC发生的区域此名称和使用的GC
阅读全文
摘要:堆内存结构 引言 垃圾收集器就是垃圾收集算法的具体实现。HotSpot7种不同分代的收集器彼此之间可能搭配使用。 Serial收集器 该收集器是单线程收集器即串行收集器,并不是说它只使用一条收集线程,而是说它收集垃圾时必须停掉其他的工作线程直到收集结束。 优点是简单高效停掉其他线程没有线程交互的开销
阅读全文
摘要:引言 判断对象是否被回收的算法有引用计数算法和可达性分析算法。其中可达性分析算法是根据GC Roots根节点作为起始点向下搜索引用链,找不到引用链则判定对象可回收。 可作为GC Roots根节点的对象主要是在全局性的引用(如常量、类静态属性)和执行上下文中(如栈帧中的本地变量表),现在的很多应用仅方
阅读全文
摘要:GC回收垃圾对象需要完成的三件事 1、哪些内存需要回收? 2、如何判断对象是否该回收? 3、如何回收垃圾对象? 哪些内存需要回收 程序计数器、虚拟机栈、本地方法栈三个区域随线程而生随线程而灭。虚拟机栈中的栈帧随着方法的开始和结束对应着入栈和出栈。每一个栈帧需分配内存的大小在类结构确定下来时就已知了。
阅读全文
摘要:参考:http://cn-done.iteye.com/blog/2041971 输出结果
阅读全文
摘要:JVM参数 -Xms:初始堆大小,默认为物理内存的1/64(<1GB),默认空余堆内存(MinHeapFreeRatio)小于40%时 JVM就会增大堆大小直到-Xmx的最大限制。 -Xmx:最大堆大小,默认空余堆内存(MaxHeapFreeRatio)大于70%时JVM会减少堆大小直到 -Xms的
阅读全文
摘要:对象的创建 当虚拟机遇到一条new指令时,首先检查这条指令的参数能否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否被加载、解析和初始化过,没有的话必须去执行相应的类加载过程。 类加载检查通过后,Java虚拟机为对象实例分配内存。对象所需的内存大小在类加载完成后就已经确定了。 如何分
阅读全文
摘要:引言 JVM执行Java程序时会将它所管理的内存划分为不同的数据区域。各数据区域的生命周期也各不相同,有的随着JVM的启动而创建,有的根据用户的线程的启动和结束而创建和销毁。 程序计数器 程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器就是通过改变这个计数器
阅读全文
摘要:引言 Java语言不要求常量一定要在编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区的运行时常量池,程序运行期间也可以将常量放入池中。 设计字符串常量池的原因 字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一
阅读全文

浙公网安备 33010602011771号