![](https://img-blog.csdnimg.cn/20190419235317847.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
深入理解Java虚拟机
文章平均质量分 97
运行时数据区域理解,对象创建过程、内存布局探索,OOM定位, 垃圾收集器算法比较,JDK命令行实验,字节码翻译,类加载分析等,用一篇一篇的文章,将java虚拟机给你整的明明白白。
面汤放盐
这个作者很懒,什么都没留下…
展开
-
垃圾收集器(下)
垃圾收集器(下) 本文将介绍CMS和G1两款虚拟机1. CMS虚拟机1.1 基本描述:CMS(Concurrent Mark Sweep) 收集器是一种以获取最短回收停顿时间为目标的收集器特点: 老年代、并发收集、低停顿1.2 运行过程:从图可以看出需要经历四个过程:初始标记(CMS initial mark)并发标记(CMS co...原创 2018-04-17 00:02:00 · 193 阅读 · 0 评论 -
锁优化
一、锁优化适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁粗化(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等,这些技术都是为了在线程之间更高效地共享数据,以及解决竞争问题,从而提高程序的执行效率。1.1 自旋锁与自适应自旋...原创 2018-06-30 17:35:05 · 310 阅读 · 0 评论 -
深入浅出 JIT 编译器(转载)
转载:https://www.ibm.com/developerworks/cn/java/j-lo-just-in-time/JIT 简介JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 Java 程序的执行速度。下面,就对该编译器技术做个简单的讲解。首先,我们大家都知道,通常通过 j...转载 2018-06-21 22:08:59 · 274 阅读 · 0 评论 -
javac编译器(笔记)
一、javac编译器 javac编译器本身就是由java语言编写的程序。1.1 编译过程 从SunJavac的代码来看,编译过程大致可以分为3个过程:解析与填充符号表过程。插入式注解处理器的注解处理过程。分析与字节码生成过程 Javac编译动作的入口是<font color=red>com.sun.tools.javac.main.Java...原创 2018-06-05 22:22:54 · 924 阅读 · 2 评论 -
虚拟机字节码执行引擎(笔记)
一、运行时栈帧结构栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟 机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.每一个栈帧都包括了局部变量表、操作数栈、动态连接、法返回地址和一些额外的附 加信息在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法表的...原创 2018-06-05 22:25:39 · 202 阅读 · 0 评论 -
类加载器
类加载器分类 名称 描述 启动类加载器(Bootstrap ClassLoader) 用来加载Java的核心类库(JAVA_HOME/jre/rt.jar); 扩展类加载器(Extension ClassLoader) 加载java扩展库(JAVA_HOME/jre/ext/*.jar) 应用类加载器(Application ClassLoader原创 2018-05-10 23:48:35 · 135 阅读 · 0 评论 -
类加载的过程
类加载过程Java虚拟机中类加载的全过程,即 加载、验证、准备、解析和初始化一、加载加载阶段需要完成以下三件事情 通过一个类的全限定名来获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口数组原创 2018-05-09 22:25:19 · 2455 阅读 · 0 评论 -
类加载的时机
类加载的时机虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。一、特点描述在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的; 其动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的; 二、触发初始化情况初始化阶段,虚拟机规范...原创 2018-05-03 21:57:23 · 213 阅读 · 0 评论 -
字节码指令简介(笔记)
字节码指令简介(笔记) Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后零至多个代表此操作所需参数(称为操作数,Operands)而构成一个字节长度,也就是指令集不能超过256条字节码指令集由于Class文件格式放弃了编译后代码的操作数长度对齐,这就意味着虚拟机处理那些超过一个字节数据的时候,不得不在运行时从字节中...原创 2018-05-01 22:56:41 · 754 阅读 · 0 评论 -
解读Class类文件结构
语言无关性 语言无关系的关键在 于 JVM 和 字节码;Java虚拟机不与任何编译成class字节码的语言绑定,只要能够编译成有效的Class字节码都解析执行。一、Class文件结构 任何一个Class文件都对应着唯一 一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成)。问题: 当出现超...原创 2018-04-29 18:16:16 · 2128 阅读 · 3 评论 -
JConsole可视化工具介绍
JConsole 可视化工具介绍一、 JConsole介绍1.1 JConsole描述 Jconsole (Java Monitoring and Management Console),一种基于JMX的可视化监视、管理工具。1.2 启动JConsole点击JDK/bin 目录下面的jconsole.exe 即可启动然后会自动自动搜索本机运行的所有虚拟机进程...原创 2018-04-23 22:55:55 · 80989 阅读 · 13 评论 -
JDK的命令行工具
JDK的命令行工具介绍主要介绍 jps、jstat、jinfo、jmap、jhat、jstatc 等几个JDK命令行工具(JDK1.8 HotSpot)数据依据来源 用工具来分析数据,以此来获取结果。下面包含四个数据依据。运行日志异常堆栈GC日志堆转储快照(heapdump/javacore文件)线程快照(threaddump/hprof文件)在J...原创 2018-04-22 00:13:04 · 3180 阅读 · 2 评论 -
JVM知识点大杂烩
JVM知识点 概况: 本文总结一些JVM杂乱的知识点,以供参考1.JVM内存结构1.1 java虚拟机运行时数据区图1.1.1 虚拟机栈(VM Stack)调用一个方法会启用(创建)一个栈帧。栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法在执行的时候会创建一个栈帧(Stack Fram)java栈是一块线程私有的...原创 2018-04-19 00:35:11 · 568 阅读 · 2 评论 -
GC 日志、内存分配与回收策略介绍
GC 日志、内存分配和回收策略介绍 虚拟机之所以提供多种不同的收集器以及提供大量的调节参数,是因为只有根据实际应用需求、实现方式选择最优的收集方式才能获取最高的性能。没有固定的收集器、参数组合,也没有最优的调优方法。1 理解GC 日志描述: 每种虚拟机的日志格式不尽相同,但都维持共性1.1 GC日志注: 具体GC日志要参考具体的虚拟机和版本1.1....原创 2018-04-18 17:54:20 · 1824 阅读 · 0 评论 -
垃圾收集器(上)
垃圾收集器(上) 描述: java虚拟机规范并未对垃圾收集器的具体实现做规范,所以不同厂商、不同版本虚拟机实现不一致;但一般都会提供参数能够进行垃圾回收器之间的组合。前言注: 基于JDK1.7Update14之后的HotSpot虚拟机 新生代收集器:Serial、ParNew、Parallel Scavenge; 老年代收集器:Serial Old、Paralle...原创 2018-04-15 19:25:21 · 501 阅读 · 0 评论 -
枚举根节点
GC Roots 枚举根节点 描述:GC Roots 被虚拟机用来判断对象是否存活。一、可以做为GC Roots的对象 位置 对象 虚拟机栈 栈帧中的本地变量表 本地方法栈 JNI(一般指的Native方法)引用的对象 方法区 静态属性引用对象 方法区 常量引用对象二、枚举根节点 可达性分析需要考...原创 2018-04-15 16:13:21 · 1762 阅读 · 0 评论 -
垃圾回收算法介绍
垃圾回收算法 本文简单介绍 标记--清除算法(Mark-Sweep) ,复制算法(Copying),标记--整理算法(Mark-Compact),分代收集算法(Generation Collection) 四种垃圾回收算法。一、标记–清除算法(Mark-Sweep)二、复制算法(Copying) 新生代中的对象98%都是“朝生夕死” ;所以并不需要按1:1...原创 2018-04-14 22:24:18 · 136 阅读 · 0 评论 -
如何确定对象为垃圾
如何确定对象为垃圾 通过引用计数、正向可达来判断对象是否是垃圾一、 引用计数 有一个引用,计数就添加1,失去引用就减一, 但是: 会有循环引用问题二、 正向可达 从roots对象(根对象)计算可达的对象。HotSpot采用了这种算法。 基本思路就是通过一系列成为 GC Roots 的对象作为起始点,向下搜索,所经过的路径叫做 引用链。 如果一...原创 2018-04-14 16:04:24 · 759 阅读 · 0 评论 -
JVM中OutOfMemoryError异常案例一方法区和直接内存
内存溢出之方法区和直接内存的介绍 通过实验来介绍方法区和直接内存区 的OOM一、方法区注:在JDK1.6 及以前版本中,由于常量池分配在永久代内,可以通过-XX:PermSize 和 -XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量。 注意JDK1.8已经使用元空间 来代替永久区,所以在1.8中,这两个参数将被忽略,而改使用-XX:Metaspa...原创 2018-04-14 14:04:28 · 1767 阅读 · 0 评论 -
JVM中OutOfMemoryError异常案例一之栈溢出
虚拟机栈和本地方法栈溢出 在HotSpot 虚拟机中不区分 虚拟机栈和本地方法栈,对应HotSpot 来说,虽然设置了 -Xoss(设置本地方法栈大小) 参数,但不起作用, 只有 -Xss参数设置有效1. 两种异常如果线程请求的栈深度大于虚拟机所允许的最大深度,则抛出StackOverflowError异常如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMe...原创 2018-04-13 00:32:28 · 1352 阅读 · 0 评论 -
JVM中OutOfMemoryError异常案例一之堆溢出
JVM中OutOfMemoryError异常案例一之堆溢出 介绍java堆的OOM1. java堆溢出 Java堆存储对象实例,只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么当对象到达堆内存允许的最大容量时就会报异常。1.1. 参数设置-XX:+HeapDumpOnOutOfMemoryError -XX:...原创 2018-04-12 23:13:12 · 1197 阅读 · 2 评论 -
JVM 中对象的访问定位
JVM 中对象的访问定位 对句柄访问对象、直接指针访问对象 的简单介绍主流的两种方式:句柄访问对象直接指针访问对象通过句柄访问对象: 注: 句柄池中包含了实例数据和类型数据,类型数据在方法区中直接指针访问对象 两种方式有各自优势:对于方式一而言,reference中存储的地址是稳定的地址,对象移动(垃圾回收时)不需要修改其值,仅需要修改...原创 2018-04-09 23:26:29 · 445 阅读 · 0 评论 -
对象的创建过程
对象的创建 简单介绍对象的创建过程1. JVM中对象的创建注意:普通Java对象的创建,不包括数组和Class对象等 的过程。 数组不能直接通过元数据本身信息确定大小,在对象头存储其长度值。分配策略: 针对多个线程则需要保证安全策略方法有二:对分配这个动作做同步策略(采用 CAS + 失败重试)使用本地线程分配缓冲(Th...原创 2018-04-09 22:00:26 · 144 阅读 · 0 评论 -
java虚拟机运行时数据区(下)
java虚拟机运行时数据区(下) 简单介绍 堆,方法区 和 直接内存1. java堆(java heap)1.1 描述: 几乎所有的对象都存放在堆中,且堆是自动化管理,通过垃圾回收机制,垃圾对象会自动清理,不需要手动释放1.2 特征:内存最大的一块,一般也是针对这块进行性能调优存对象所有线程共享注:堆解构会有详细介绍。2. 方法区...原创 2018-04-08 20:16:38 · 166 阅读 · 0 评论 -
java虚拟机运行时数据区(上)
java虚拟机运行时数据区(上)注意:JDK1.7概况主要讲解虚拟机运行时数据区,看图说话。 1. 程序计数器(Program Counter Register)程序计数器相对于一个团队的指挥,团队指挥人数肯定少,所以程序计数器占比内存也小,但是却很重要;每个团队都有自己的指挥,不能说团队之间公用指挥,所以指挥对团队而言是私有的,所以程序计数器对 线程而言就是私...原创 2018-04-07 19:48:33 · 269 阅读 · 0 评论