jvm
文章平均质量分 82
yueyemaitian
这个作者很懒,什么都没留下…
展开
-
深入java虚拟机 补充资料
[url="http://product.china-pub.com/14719"]Inside The JVM(2nd edition)[/url]实在是有点老了,java5和java6对class file format已经有了不少改动。java6的class file format资料ClassFile-Java6可以从[url="http://www.mobilefish.com/do...2009-09-20 20:19:08 · 76 阅读 · 0 评论 -
ASM4.0源码走读之三 readCode方法分析方法代码
继第一篇,我们来看看readCode的代码: private void readCode(final MethodVisitor mv, final Context context, int u) { // reads the header byte[] b = this.b; char[] c = context...原创 2013-03-09 00:19:29 · 528 阅读 · 0 评论 -
在编译级别1.4时jvm编译try/catch/finally块的方式
先上一段很简单,且不考虑健壮性的源码:import java.io.FileInputStream;import java.io.IOException;public class TryCatchFinallyTest { /** * @param args * @throws IOException */ public static v...原创 2013-03-12 21:22:25 · 146 阅读 · 0 评论 -
Kilim源码分析之二 ---- 织入入口及可织入判断
1、织入入口,配置 1.1、织入入口 kilim.tools.Weaver是织入的主类,通过程序参数设置要织入的代码路径,可以是class文件、jar包、其他(是什么)、目录(目录中可以是jar包、class文件)。 如果传入的是class文件,会直接织入;调用kilim.tools.Weaver.weaveFile(String, InputS...原创 2013-03-20 19:33:52 · 239 阅读 · 0 评论 -
Kilim源码分析之三 ---- 织入之构造/合并BasicBlock
上一篇分析了可织入判断的代码,本篇继续分析织入部分的构造/合并BasicBlock。 首先看下分析方法kilim.analysis.MethodFlow.analyze()包含的功能: //织入逻辑 public void analyze() throws KilimException { buildBasicBlock...原创 2013-03-20 19:50:17 · 320 阅读 · 0 评论 -
Kilim源码分析之四 ---- 织入之内联subroutine
小于1.5编译级别时,如果不显示inline try/catch/finally块,try/catch和any会产生的jsr指令跳转到finally。此处分析kilim如何对这种情况下的jsr指令进行内联:finally块中有pausable则会被拷贝一份;finally块中有pausable则会把jsr/ret指令都替换为goto指令,但是并没有像1.5及以后编译级别那样,拷...原创 2013-03-20 20:00:50 · 193 阅读 · 0 评论 -
Kilim源码分析之五 ---- 织入之变量活跃性分析
/** * In live var analysis a BB asks its successor (in essence) about which * vars are live, mixes it with its own uses and defs and passes on a * new list of live vars to i...原创 2013-03-20 21:00:28 · 205 阅读 · 0 评论 -
一次线上问题的排查过程——时钟精度变化导致的cpu占用率高的问题
最近升级了一次tair(缓存系统)的client jar包——一个完全被重写了的版本,发布到线上的时候,发现某个新上线机房机器cpu占用率比较高,一般50%—100%之间(5核的虚拟机),而另外两个机房机器的cpu使用率却比较低。 1、用top查看是java进程的占用的绝大多数cpu 2、用top H或者top -p PID H查看发现是只有...原创 2013-09-16 21:14:41 · 1082 阅读 · 0 评论 -
cache line对内存访问的影响
cache line对内存访问的影响很早就看到了,但是没有写过例子跑过,突然兴起就写了下,对这里第一个例子稍微做了改造。要注意jvm参数设置,新生代+老生代分配了2.4xG内存,新生代分了2G,eden区分了1.6g,从实际内存占用看,数组eden区使用了近1.1G的内存,剩下区域基本都是空的。另,demo是在mac上跑的。/** * -Xms2500m -Xmx250...原创 2014-03-12 20:48:37 · 397 阅读 · 0 评论 -
cpu字长、操作系统字长和jvm中各数据类型占用的字节数关系
cpu字长是指cpu同时参与运算的二进制位数,现在主流的pc的机器字长都是64位的。机器字长直接决定着机器可寻址的虚拟空间地址大小。 The word size of a computer generally indicates the largest integer it can process in a single instruction, and the siz...原创 2014-03-16 02:05:27 · 552 阅读 · 0 评论 -
一个对象占用多少字节?
老早之前写过一篇博客,是关于一个Integer对象到底占用多少字节的,现在看来,那篇文章竟然计算错了。这次再去计算,是因为之前写的一篇关于字长的文章里,看到了hotspot jvm里,对象占用空间是8字节对齐的,再加上之前关于字节那文章里带着一点-XX:+UseCompressedOops压缩指针参数的疑问,重新探究了下一个对象到底占用多少字节,以及如何计算它占用空间的方法。主...原创 2014-03-18 21:56:21 · 616 阅读 · 0 评论 -
查看java对象在内存中的布局
接着上篇《一个对象占用多少字节?》中遇到的问题: UseCompressOops开启和关闭,对对象头大小是有影响的,开启压缩,对象头是4+8=12byte;关闭压缩,对象头是8+8=16bytes。这个如何观察验证呢? 基于上述事实,通过new A()和new B()占用字节推断,基本类型int在开启、关闭压缩情况下都是占用4个bytes的,这个没...2014-03-20 22:39:39 · 1074 阅读 · 0 评论 -
Mac OSX 10.9 上build openjdk8和openjdk7
先分享下自己build出来的fastdebug版本的openjdk: openjdk7(24.80-b04), openjdk8(25.0-b70)===================================================================================== 由于想看下cms gc的debug日志...2014-03-29 18:29:50 · 249 阅读 · 0 评论 -
ASM4.0源码走读之二 指令的类型
在深入分析ClassReader.readCode()方法之前,我们需要大概了解下ASM把jvm的指令分的类型,这在readCode会用到。先看ClassReader的代码: static { int i; byte[] b = new byte[220]; String s = "AAAAAAAAAAAAAAAA...原创 2013-03-08 23:51:13 · 259 阅读 · 0 评论 -
ASM4.0源码走读之一
了解java class文件格式是读懂asm代码的前提,所以在此之前请找Java虚拟机规范里边class文件格式章节细读一下。 不过在详解读入过程之前,先简单看下jvm规范中对class文件格式的定义,其中一个u代表一个byte,u1、u2、u4分别代表1、2、4个字节:ClassFile { u4 magic; u2 minor_versi...原创 2013-03-08 23:18:27 · 365 阅读 · 0 评论 -
java协程框架----kilim实现机制解析
java语言处理多任务的模式是基于多线程,java语言级别原生并不支持协程,我们想要java语言支持协程,就需要在线程和协程之间架起一道桥梁。在某个事件点(我们成为挂起点)上,我们在应用级别备份当前任务在线程上的调用栈信息(包括局部变量和操作栈上的数据),释放线程,让它去执行下一个任务;等某些事件被触发的时候,重新执行刚才的任务,用之前备份的调用栈信息恢复线程的调用栈,从挂起点开始执行。...原创 2013-03-08 16:14:32 · 585 阅读 · 0 评论 -
JVM学习笔记一 之 概述
国庆放假没买到票,没回家,呆在住的地方,花了三天时间看了下<<深入理解Java虚拟机>>,算是对以前看过的《深入Java虚拟机》的一个有力补充,前者有很多作者实际的例子,后者偏向于理论上的东西,不过后者太老了。接下来对看过的这些东西做一下整理稍微做下记录,由于是读书笔记,内容结构上可能跟原书比较相似。一、java平台 java平台由四部分组成: 1、jav...原创 2011-10-04 22:05:04 · 107 阅读 · 0 评论 -
JVM学习笔记二 之 .class文件
一、概述 Java的源码编译后的class文件,具有非常严谨的结构,文件各个部分内容的完整性也通过自身描述来校验。 开始描述class文件内容前,我们先定义一些说明:u1代表一个字节,也是两个16进制字符,u2、u4、u8分别代表2、4、8个字节二、类文件整体结构名称类型*长度字段含义魔数u4 * 1固定值,十六进制表示是CAFEBABE,表示该文件是一...原创 2011-10-05 00:52:21 · 119 阅读 · 0 评论 -
JVM学习笔记三 之 ClassLoader
一、ClassLoader 负责装载class文件;这个文件来源可能是压缩包、网络、运行时编译出的或者自动生成的class文件,jvm spec没有规定必须从什么地方加载。 jvm中默认提供了三种系统类加载器: 1)、启动类加载器Bootstrap ClassLoader,负责加载%JAVA_HOME%\jre\lib目录下的包, 2)、扩展类加载器Ext ClassLo...原创 2011-10-05 00:57:20 · 210 阅读 · 0 评论 -
JVM学习笔记四 之 运行时数据区
一、概述 运行时数据区是jvm运行时的内存布局,类装载到内存后存放的位置,为执行引擎提供所需指令和数据。运行时数据区包括:堆、栈、方法区、本地方法栈、pc计数器。 接下来会详细介绍各个部分,并介绍直接内存访问和方法区中的常量池,另外对于每个区域可能发生的内存异常用demo做讲解。二、详细介绍各部分 1、堆 分配运行时产生的对象分配在堆中,但是并不是一定就分配在堆中,随着运行时编...原创 2011-10-09 00:44:02 · 157 阅读 · 0 评论 -
JVM学习笔记五 之 装载(类型的生命周期系列)
一、概述 类型的生命周期分为装载、连接、初始化、实例的生命周期(使用)和卸载(实例化算是类型生命周期的一部分么?)。装载是指把表示类型信息的二进制字节码装入到内存。连接阶段包括验证、准备和解析,验证包括语法、语义、字节码流和引用验证;准备是给类变量分配内存并赋默认值;解析是把符号引用解析为直接饮用。初始化阶段是给静态变量赋值,包括静态语句和静态块里边的赋值操作。实例的生命周期阶段就包...原创 2011-10-18 00:33:59 · 140 阅读 · 0 评论 -
JVM学习笔记六 之 连接(类型的生命周期系列)
一、概述 类型的连接是指把字节码二进制静态结构合并到运行时状态中去。连接又分为验证、准备和解析三个阶段。二、验证 验证装载到jvm中的字节码流的合法性。jvm spec没有规定具体做什么验证。根据不同的虚拟机实现大概又分为语法验证、语义验证、字节码流验证和引用验证。 1、语法验证,校验字节码语法正确性,使得该类型信息可以存储在方法区内,如魔数、主次版本号、Utf8常量池表项中存储的...原创 2011-10-24 01:24:14 · 93 阅读 · 0 评论 -
JVM学习笔记七 之 初始化(类型的生命周期系列)
初始化阶段是为类型变量赋予正确的初始值,初始化分为两个阶段: 1、如果直接超类还没有进行初始化,则先初始化直接超类。 2、如果类存在一个初始化方法<clinit>,则调用该方法。 <clinit>是在编译java源码时,按照静态块和静态变量赋值语句的顺序生成的。如果类没有静态块也没有为静态变量赋值,就不会生成<clinit>方法,该方法只能被虚拟机...原创 2011-10-24 02:10:32 · 95 阅读 · 0 评论 -
JVM学习笔记八 之 对象创建和使用(对象生命周期系列)
一、对象创建 类型信息在装载、连接和初始化之后,就可以使用了,可以访问类型的静态字段和方法,可以创建类型实例。对象的创建分为现实创建和隐式创建两种。 显示创建分为:1、通过new创建;2、通过java.lang.Class的newInstance方法创建;3、通过clone方法创建;4、通过java.io.ObjectInputStream的readObject方法创建。 隐式创建...原创 2011-10-24 23:17:45 · 125 阅读 · 0 评论 -
JVM学习笔记九 之 GC(对象的生命周期系列)
一、概述 Java最大的一个特点就是不用开发人员手动释放对象的内存,这些任务就交给了jvm来做。垃圾收集器有很多分类,如按照并行(ParNew、Parallel Scavenage、Parallel Old、CMS并发标记阶段、g1)、并发(cms并发标记和并发清理阶段、g2)和串行(Serial、Serial Old/PS Mark-Sweep),按照算法分引用计数和跟踪算法,按照性能...原创 2011-10-25 00:16:27 · 830 阅读 · 0 评论 -
JVM学习笔记十 之 字节码执行引擎
一、概述 jvm spec只给出了执行引擎的概念模型,并没有规定具体实现细节。执行引擎在执行时候可以解释执行、编译执行或直接由嵌入芯片的指令执行。引擎的行为使用指令集来定义。 java的目标是一次编写到处运行,为了达到这个目标,jvm指令集就不能依赖于任何硬件平台的指令,jvm指令集中就只有对栈的操作,没有对特定于硬件平台的寄存器的操作。当然jvm运行期优化的时候,可以针对不同的硬件平台提...原创 2011-10-26 00:45:15 · 134 阅读 · 0 评论 -
JVM学习笔记十一 之 编译期优化和运行期优化
一、概述语言要在虚拟机上执行,必须先翻译成机器代码,翻译的方式有两种,一种是编译期静态翻译为机器码,一种是编译器翻译为某种表示,运行期在翻译成机器码来执行。编译器可分为多种类型,1、编译器把java源文件编译成class文件的前端编译器,如javac和eclipse的jdt增量编译器;2、运行期把.class文件翻译成本地机器代码的JIT编译器,如HotSpot VM的C1、C2编译器...原创 2011-10-27 01:29:01 · 235 阅读 · 0 评论 -
由一个小程序引发的思考 — 关于字段和方法的分派
面向对象三大特征封装、继承和多态,此处我们一般都知道方法的多态性,覆盖和重载。但是字段呢?当然根据定义,跟字段无关,也就是不能覆盖?先看一个小程序:package com.yymt.jvm.method.dispatch;public class DispatchTest { public static void main(String[] args) { Base b =...2011-11-05 14:32:04 · 116 阅读 · 0 评论 -
jvm运行期打印汇编信息
如果只在jvm参数中加入-XX:+PrintAssembly参数,运行报错:Improperly specified VM option 'PrintAssembly'Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will...原创 2014-04-09 23:00:27 · 369 阅读 · 0 评论