深入JVM
文章平均质量分 92
通过对JVM的执行引擎的介绍,以及对于字节码的整理。结合字节码生成技术的底层框架——ASM。深入JVM的执行机制以及运行时内存模型。
智秒数服.未闻
camping~candy
展开
-
JVM性能调优实践——G1 垃圾收集器分析、调优篇
前言关于G1 GC以及其他垃圾收集器的介绍可以参考前一篇JVM性能调优实践——G1 垃圾收集器介绍篇。了解了G1垃圾收集器的运行机制之后,就可以针对一些GC相关参数来调整内存分配以及运行策略。下文的调优主要针对G1垃圾收集器进行介绍,以及会分析一下G1 GC的日志格式。 G1 GC日志分析在执行具体的调优任务前,需要结合GC日志以及应用本身的特点。打印详细GClog,...原创 2018-06-04 13:58:15 · 19153 阅读 · 18 评论 -
JVM性能调优实践——G1 垃圾收集器介绍篇
前言前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇。这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结合open-jdk源码分析下重要算法如SATP,重要存储结构如CSet、RSet、TLAB、PLAB、Card Table等。最后会再梳理下G1 GC的YoungGC,MixedGC收集过程。 ...原创 2018-05-30 17:34:59 · 25765 阅读 · 42 评论 -
JVM性能调优实践——性能测试篇
前言本文主要基于工作中,关于性能调优的一些零散的信息整理。总结性的信息,以测试环境为例。系统信息如下: os: Linux 64位jdk:java version “1.8.0_121”, HotSpot(TM) 64-Bit Server VMdocker version: 17.04.0-ce第一篇先整理一些性能指标。第二篇整理一下jvm的性能问题分析,以及基于dock...原创 2018-05-15 17:11:56 · 6908 阅读 · 0 评论 -
JVM性能调优实践——JVM篇
前言在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践——性能指标分析。 JVM的调优和故障处理可以使用JDK的几个常用命令工具。因为本文是基于Docker容器内部的Springboot服务。需要调整一下docker容器的启动参数,才可以使用jma...原创 2018-05-24 11:46:49 · 35461 阅读 · 10 评论 -
ASM(一) 利用Core API 解析和生成字节码
ASM是一个提供字节码解析和操作的框架。Cglib框架就是基于ASM框架实现的,被广泛应用的Hibernate,Spring就是基于Cglib 实现了AOP技术。 在说到AOP的Java实现,可能会优先想到java的Proxy api,通过invoke方法拦截处理相应的代码逻辑,但是proxy 是面向接口的,被代理的class的所有方法调用都会通过反射调用invoke 方法,相对性能开销原创 2015-06-09 18:58:44 · 20278 阅读 · 0 评论 -
ASM(二) 利用Core API 变更类成员
这一篇把这producer(ClassReader)和consumer(ClassWriter)来结合起来介绍一下如何动态添加 移除 Java 类成员以及利用一些ASM工具类。原创 2015-06-13 17:32:38 · 19062 阅读 · 0 评论 -
ASM(三) 利用Method组件动态生成方法的字节码
一、概述 ASM的CoreApi 中还提供了对class 中方法的生成和解析的组件。前面两篇着重介绍了ClassVisitor 组件的应用场景。ClassVisitor Api 中的visitMethod(int access, String name, String desc, String signature, String[] exceptions)方法返回了一个MethodV原创 2015-07-01 21:48:30 · 20901 阅读 · 0 评论 -
ASM(四) 利用Method 组件动态注入方法逻辑
这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以通过继承MethodVisitor,来编写一个MethodXXXAdapte原创 2015-07-02 20:17:39 · 20935 阅读 · 2 评论 -
ASM(五) 利用TreeApi 解析生成及转换Class
篇开始介绍ASM另一部分主要的Api。TreeApi。这一部分源码是关联的asm-tree-5.0.4的版本。 在介绍前,先要知道一点, Tree工程的接口基本可以完成大部分我们之前介绍的Core中的功能。但是在实际使用中更加便利,当然也会更加消耗时间和性能。完成一个简单的生成编译后的Class字节码的任务,可能会花费多余Core的30%的时间,同时也会消耗更多内存。但是通过下面的介绍,相信在选择用哪种Api上,我们也会做出自己的取舍和判断。原创 2015-07-15 19:57:27 · 21305 阅读 · 0 评论 -
ASM(六) 利用TreeApi 动态生成以及转换方法字节码
一、MethodNode概述 ASM的TreeApi 对于Method的转换、生成也提供了一系列的组件和接口。其功能主要基于前一章提到的MethodNode类。MethodNode中大多数属性和方法都和ClassNode类似,其中最主要的属性就是InsnList了。InsnList是一个双向链表对象,包含了存储方法的字节指令序。先来看下InsnList中的主要是属性和方法:原创 2015-08-29 18:52:50 · 22786 阅读 · 2 评论 -
JVM字节码执行模型及字节码指令集
JVM执行模型,是如何把Class文件里的字节码转换成我们的虚拟机栈的操作指令,以及整个虚拟机栈的内部数据结构是怎样的,这篇文章后续会详细介绍,并且稍微扩展下JVM规范中的一些字节码指令集。原创 2015-06-19 16:25:05 · 22747 阅读 · 3 评论 -
JVM 字节码指令对于栈帧数据操作举例
这一篇其实是对前面一篇《JVM字节码执行模型及字节码指令集》的一个延续和举例。结合例子看一下条件判定和无条件跳转指令对虚拟机栈的数据操作。 我们先来看一段代码例子。这里addEspresso()添加浓度方法会判断参数,如果参数package bytecode;/** * * Created by yunshen.ljy on 2015/6/21. */public原创 2015-06-21 16:23:14 · 18879 阅读 · 0 评论 -
JVM StackMapTable 属性的作用及理解
在Java 6版本之后JVM引入了栈图(Stack Map Table)概念。为了提高验证过程的效率,在字节码规范中添加了Stack Map Table属性,以下简称栈图,其方法的code属性中存储了局部变量和操作数的类型验证以及字节码的偏移量。也就是一个method需要且仅对应一个Stack Map Table。在Java 7版本之后把栈图作为字节码文件中的强制部分。 本来程序员是不需要关心JV原创 2015-07-01 21:48:24 · 25531 阅读 · 10 评论 -
从字节码指令看重写在JVM中的实现
Java是解释执行的,包括动态链接的特性,都给解析或运行期间提供了很多灵活扩展的空间。面向对象语言的继承、封装和多态的特性,在JVM中是怎样进行编译、解析,以及通过字节码指令如何确定方法调用的版本是本文如下要探讨的主要内容,全文围绕一个多态的简单举例来看在JVM中是如何实现的。原创 2015-07-30 19:22:35 · 19554 阅读 · 0 评论 -
通过字节码分析JDK8中Lambda表达式编译及执行机制
关于Lambda字节码相关的文章,很早之前就想写了,线上产品的后端技术,能快速迭代,除了得益于整体微服架构之外,语言层面上,也是通过Java8的lambda表达式的运用以及rxJava响应式编程框架,使代码更加简洁易维护,调用方式更加便捷。本文将介绍JVM中的方法调用相关的字节码指令,重点解析JDK7(JSR-292)之后新增的invokedynamic指令给lambda表达式的动态原创 2016-04-23 13:07:01 · 26618 阅读 · 16 评论