- 浏览: 4939992 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (2844)
- java (1094)
- hadoop (37)
- jvm (39)
- hbase (11)
- sql (25)
- 异常 (83)
- div css (6)
- 数据库 (95)
- 有趣的code (15)
- struts2 (6)
- spring (124)
- js (44)
- 算法 (65)
- linux (36)
- hibernate (7)
- 中间件 (78)
- 设计模式 (2)
- 架构 (275)
- 操作系统 (91)
- maven (35)
- tapestry (1)
- mybatis (9)
- MQ (101)
- zookeeper (18)
- 搜索引擎,爬虫 (208)
- 分布式计算 (45)
- c# (7)
- 抓包 (28)
- 开源框架 (45)
- 虚拟化 (12)
- mongodb (15)
- 计算机网络 (2)
- 缓存 (97)
- memcached (6)
- 分布式存储 (13)
- scala (5)
- 分词器 (24)
- spark (104)
- 工具 (23)
- netty (5)
- Mahout (6)
- neo4j (6)
- dubbo (36)
- canal (3)
- Hive (10)
- Vert.x (3)
- docker (115)
- 分布式追踪 (2)
- spring boot (5)
- 微服务 (56)
- 淘客 (5)
- mesos (67)
- php (3)
- etcd (2)
- jenkins (4)
- nginx (7)
- 区块链 (1)
- Kubernetes (92)
- 驾照 (1)
- 深度学习 (15)
- JGroups (1)
- 安全 (5)
- 测试 (16)
- 股票 (1)
- Android (2)
- 房产 (1)
- 运维 (6)
- 网关 (3)
最新评论
-
明兜3号:
部署落地+业务迁移 玩转k8s进阶与企业级实践技能(又名:Ku ...
Kubernetes系统常见运维技巧 -
q328965539:
牛掰啊 资料收集的很全面
HDFS小文件处理解决方案总结+facebook(HayStack) + 淘宝(TFS) -
guichou:
fluent挂载了/var/lib/kubelet/pods目 ...
kubernetes上部署Fluentd+Elasticsearch+kibana日志收集系统 -
xu982604405:
System.setProperty("java.r ...
jmx rmi 穿越防火墙问题及jmxmp的替代方案 -
大漠小帆:
麻烦问下,“获取每个Item相似性最高的前N个Item”,这个 ...
协同过滤推荐算法在MapReduce与Spark上实现对比
jvm虚拟指令集
假定:“必须”的含义
对于jvm指令的一些“必须”的要求,在运行期要求javaclass的结构是满足约束的,对于不满足约束的情况,jvm的行为是未定义的。
保留操作码
在java class文件中使用的指令操作码,有三个操作码是保留的,供java虚拟机内部使用。
254(0xfe)和255(0xff),分别有助记符impdep1和impdep2,目的是在软件或者硬件实现的特定功能提供“后门”或陷阱。
202(0xca),有助记符breakpoint,目的是由调试程序使用来实现断点。
虚拟机错误
当内部错误或者资源限制导致java语言语义不能实现时,jvm抛出一个VirtualMachineError类的子类的实例。jvm规范不规定和语言抛出的时间和地点。
jvm指令集
我不一一例举各种指令的操作码和用法,需要时去查就行了。
第七章 为jvm编译
java编译成为class文件之后,以类汇编的jvm操作指令方式存在,jdk自带的javap程序具有这样的功能,将class文件翻译为这样的指令集。
下面是我测试的一个实例:
源文件为test.java
public class test {
public static String a = "";
public int i =0;
public test() {
int i=0;
String a = "xyz";
}
}
编译完成为test.class,用javap生成之后输出结果为:
javap -c -classpath "c:/" test
public class test extends java.lang.Object{
public static java.lang.String a;
public int i;
static {};
Code:
0: ldc #4; //String
2: putstatic #5; //Field a:Ljava/lang/String;
5: nop
6: return
public test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: aload_0
5: iconst_0
6: putfield #2; //Field i:I
9: iconst_0
10: istore_1
11: ldc #3; //String xyz
13: astore_2
14: nop
15: return
}
7.2常数、局部变量和控制结构的使用
jvm是面向栈的,大多数操作都是从当前框架的操作数栈中取得操作数。
7。3运算
jvm一般在操作数栈上进行运算,即从栈中取操作数,并将结果存入操作数栈中。
7。4访问常数池
byte,char,short,以及小int值都可以通过立即数的方式编译在method的code中,但是int,long,float,double,以及string实例的引用,就需要对常数池进行访问了。使用ldc,ldc_w,ldc2_w指令管理。
7.5更多控制范例
可供查阅
7。6接收参数
如果向java实例方法传递了n个参数,它们被接收,按约定,框架的编号1到n的局部变量为新的方法调用创建,顺序为接收的顺序。
7。7调用方法
对java实例方法的调用,是在对象的运行期类型上调度的。用invokevirtual实现,将其参数取做对常数池表项的索引,给出对象的类类型的完整限定符名称,再调用方法的名称和方法的描述符。
对java静态(类)方法的调用,无需传递类实例,其余和实例方法相似,用invokespecial方法实现。
invokespecail指令用于调用实例初始化方法。超类方法和调用private方法。
7。8处理类实例
构建一个类实例的过程,在建立对象及其实例域之后,用invokespecial调用相应构造函数对应的方法来初始化对象。
对对象域的访问用getfield和putfield指令完成。
7。9数组
主要讲的是数组操作的相关jvm指令,如:newarray,过一遍,可以查阅。
7。10编译开关
对于java的switch指令,jvm有对应的两种指令:tableswitch,lookupswitch.
tableswitch指定取值范围,而lookupswitch并不指定取值范围,两者如何选择完全由效率选择决定。
7。11对操作数栈的操作
jvm有大量的指令补充,将操作数栈的内容作为无类型字或成对的无类型字操纵。便于jvm虚拟机指令的灵活组成。
如dup,dup_x2等,都是对字或者双字进行操作。
7。12抛出或者处理异常
jvm中try...catch块的处理对于jvm指令处理是透明的,辅助控制是由异常表来完成的,由异常表来决定到哪里去调用处理,哪些部分的异常是受控的。
7。13编译finally
try.....finally语句与try-catch相似,只是其辅助控制是由指令jsr(子例程调用)显式的表示,在jsr调用之前,将下一指令的地址压入栈中。而异常表只控制try块的范围。
7。14同步
jvm用monitorenter和monitorexit指令对同步提供显式支持。而java常用sychronized方法。
sychronized“方法”通常不是用monitorenter和monitorexit指令实现的。往往是由“方法调用指令”检查常数池里的ACC_SYCHRONIZED标志
但monitorenter和monitorexit指令是为了支持sychronized“语句”而存在的。
注意这里的方法和语句的区别。
语句实例如下:test.java
public class test {
public test() {
}
public static void main(String[] args) {
synchronized(new Object()){
int i = 0;
}
}
}
编译完的结果:
C:\JBuilderX\bin>javap -c -classpath "d:/epm40/classes" test
public class test extends java.lang.Object{
public test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: nop
5: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class Object
3: dup
4: invokespecial #1; //Method java/lang/Object."":()V
7: dup
8: astore_1
9: monitorenter // Enter the monitor associated with object
10: iconst_0
11: istore_2
12: nop
13: aload_1
14: monitorexit // Exit the monitor associated with object
15: goto 23
18: astore_3
19: aload_1
20: monitorexit // Be sure to exit monitor...
21: aload_3
22: athrow
23: nop
24: return
Exception table:
from to target type
10 15 18 any
18 21 18 any
}
monitorenter和monitorexit
详见http://java.sun.com/docs/books/vmspec/2nd-edition/html/Instructions2.doc9.html
The objectref must be of type reference.
Each object has a monitor associated with it. The thread that executes
monitorenter gains ownership of the monitor associated with objectref.
If another thread already owns the monitor associated with objectref,
the current thread waits until the object is unlocked, then tries again
to gain ownership. If the current thread already owns the monitor
associated with objectref, it increments a counter in the monitor
indicating the number of times this thread has entered the monitor. If
the monitor associated with objectref is not owned by any thread, the
current thread becomes the owner of the monitor, setting the entry count
of this monitor to 1.
monitorenter操作的目标一定要是一个对象,类型是reference。Reference实际就是堆里的一个存放对象的地
址。每个对象(reference)都有一个monitor对应,如果有其它的线程获取了这个对象的monitor,当前的线程就要一直等待,直到获得
monitor的线程放弃monitor,当前的线程才有机会获得monitor。
如果monitor没有被任何线程获取,那么当前线程获取这个monitor,把monitor的entry count设置为1。表示这个monitor被1个线程占用了。
当前线程获取了monitor之后,会增加这个monitor的时间计数,来记录当前线程占用了monitor多长时间。
源博客--http://www.blogjava.net/flyffa/archive/2006/08/24/65566.html
发表评论
-
Kryo 使用指南
2017-12-05 20:14 18931、Kryo 的简介 Kryo 是一个快速序列化/ ... -
spring session序列化问题排查
2017-12-01 19:07 6159严重: Servlet.service() for ser ... -
利用junit对springMVC的Controller进行测试
2017-11-30 16:26 1403平时对junit测试service/D ... -
Java内存模型之重排序
2017-11-29 09:44 822在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重 ... -
pmd spotbugs 文档
2017-11-28 10:02 0https://pmd.github.io/pmd/pmd ... -
PMD、FindBug、checkstyle、sonar这些代码检查工具的区别?各自的侧重点是什么?
2017-11-28 10:01 2099可以说都是代码静态分析工具,但侧重点不同。pmd:基于源代码 ... -
阿里巴巴Java代码规约插件p3c-pmd使用指南与实现解析
2017-11-23 17:09 1537阿里巴巴Java代码规约插件安装 阿里Java代码规 ... -
静态分析工具PMD使用说明 (文章来源: Java Eye)
2017-11-23 17:07 1106质量是衡量一个软件是否成功的关键要素。而对于商业软件系统,尤 ... -
MyBatis 使用 MyCat 实现多租户的一种简单思路
2017-11-20 18:27 2802本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进 ... -
Spring+MyBatis实现数据库读写分离方案
2017-11-20 17:15 1026百度关键词:spring mybatis 多数据源 读写分离 ... -
数据库连接池druid wallfilter配置
2017-11-20 11:38 1230使用缺省配置的WallFilter <be ... -
java restful 实体封装
2017-11-16 09:47 1541package com.mogoroom.bs.commo ... -
dak
2017-11-15 11:21 0package zzm; import jodd.ht ... -
Java内存模型之从JMM角度分析DCL
2017-11-15 09:35 596DCL,即Double Check Lock,中卫双重检查锁 ... -
Java 打印堆栈的几种方法
2017-11-14 09:36 4665java 中可以通过 eclipse 等工具直接打印堆栈, ... -
Servlet Session学习
2017-11-10 09:25 506HTTP 是一种"无状 ... -
浅析Cookie中的Path与domain
2017-11-10 09:26 1013Path – 路径。指定与co ... -
入分析volatile的实现原理
2017-11-08 09:47 629通过前面一章我们了解了synchronized是一个重量级的 ... -
Spring MVC-ContextLoaderListener和DispatcherServlet
2017-11-15 09:35 636Tomcat或Jetty作为Servlet ... -
搭建spring框架的时候,web.xml中的spring相关配置,可以不用配置ContextLoaderListener(即只配DispatcherServl
2017-11-07 18:27 1385搭建spring框架的时候,web.xml中的sprin ...
相关推荐
jvm调优测试仓库-jvm-monitor
这个是jvm指令手册,可以通过该手册查找理解字节码程序,超详细,超好用!!
JVM指令手册详细完整版.pdf
JVM常用指令手册
JVM Monitor 是一个 Eclipse 上的插件,用来分析Java应用程序运行的信息,包括CPU占用、线程以及内存的使用情况。
jvm指令手册,东西很全,很标准,适合java进阶学习
jvm查询配置指令
在学习JVM时.指令集必不可少; 该资源有word和pdf两种模式
jvm指令手册
JVM图解-JVM指令-JVM原型图.rar
JVM指令主要分为:本地变量表到操作数栈类指令、操作数栈到本地变量表类指令、常数到操作数栈类指令、将数组指定索引的数组推送至操作数栈类指令、将操作数栈数存储到数组指定索引类指令、操作数栈其他相关类指令、...
JVM指令手册.java代码经过javap-v可以查看java指令,配合指令手册可以查看详细操作过程
JVM指令码表,JVM运行原理学习的必备工具。常量入栈指令、局部变量值转载到栈中指令、将栈顶值保存到局部变量中指令、wide指令、通用(无类型)栈操作指令、类型转换指令、整数运算、浮点运算等指令。
jvm指令集
JVM指令集
jvm指令码参照表,可以根据此表找到javap命令解析出来的文件进行翻译。 0x01 aconst_null null值入栈。 0x02 iconst_m1 -1(int)值入栈。 0x03 iconst_0 0(int)值入栈。 0x04 iconst_1 1(int)...
JVM指令操作解析及指南手册.pdf
JVM指令集
JVM指令查询手册.pdf