Change Dir

先知cd——热爱生活是一切艺术的开始

统计

留言簿(18)

积分与排名

“牛”们的博客

各个公司技术

我的链接

淘宝技术

阅读排行榜

评论排行榜

JVM学习笔记(0)——JVM一把抓

从毕业的时候断断续续读这本书,发现已经很久了,一直只是到概念层次,没有深入细节。今天重读这本书,希望能从中获取更多。

今天先开个头。笔记是无结构的流式记录,类似tips的list吧~

  1. 每个java程序运行于自己的JVM实例中,java程序的启动入口必须是public static void main(String[] args);
  2. 每个java程序,开始于main,结束于所有非守护线程的终止;
  3. jvm的体系结构包含:类装载器子系统(装载class)、运行时数据区(存放数据)、执行引擎(执行被装载类的指令);
  4. 运行时数据区包含:堆、方法区、java栈、本地方法栈、PC寄存器。其中堆和方法区是所有线程共享的,而其他三者是线程独享的;
  5. jvm数据类型分两种:基本类型{数值类型{浮点数{float,double},整数{byte,short,int,long,char}},boolean,returnAddress}和引用类型{引用{类,接口,数组}},基本类型存数据本身,引用类型存数据引用;
  6. boolean是个特别的类型,jvm处理按int来操作,0为false,非0为true,boolean数组是按byte数组来访问的;
  7. 引用类型中,类和接口都是对类或者实现了接口的类的实例的引用,数组是对数组对象的引用,一个特殊引用是null,表示没有引用任何对象;
  8. 数据类型取值范围:{byte:1字节有符号,short:2字节有符号,int:4字节有符号,long:8字节有符号,char:2字节无符号,float:4字节IEEE754单精度,double:8字节IEEE754双精度,returnAddress:统一方法中某操作码的地址,reference:堆中对象的引用或null}
  9. JVM数据单元是字,字长的设计最短要32bit即4个字节,保证能容纳byte,short,int,char,float,returnAddress和reference类型的值;
  10. JVM有两种类加载器:启动类装载器和用户自定义类装载器,前者是jvm实现的一部分,后者是java程序的一部分,不同类装载器装载的类被放在虚拟机内部不同的命名空间;
  11. 方法区存储:{类加载时,读入class文件后,解析得到的类型信息:全限定名,直接父类的全限定名,是类类型还是接口类型,访问修饰符,直接实现接口的全限定名有序列表},{常量池:直接常量(string,int等)和对其他类型、字段和方法的符号引用},{字段信息:字段名,字段类型,字段修饰符},{方法信息:方法名,方法返回类型,方法参数的数量和类型,方法的修饰符},{类变量:static},{编译时常量:final},{指向ClassLoader的引用:如果是自定义装载的},{指向Class类的引用:Class.forName()或者object.getClass()},{方法表:虚拟机为每个非抽象类生成一个方法表};
  12. 堆存储:所有运行时创建的类实例或数组都放到同一个堆中;
  13. 程序计数器:大小1个字长,内容总是下一条将被执行指令的地址;
  14. java栈:只有push和pop操作,单位是一个栈帧,保存线程的运行状态,每个帧中存储当前的参数、局部变量、中间运算结果等。当方法以return或者异常抛出结束时,当前帧pop,当调用一个java方法时,push一个帧成为当前帧。因为java栈数据是每线程私有的,可以不考虑同步问题。java栈的每个栈帧又包含三部分:局部变量区、操作数栈和帧数据区。局部变量和方法参数存入局部变量区,操作数栈是jvm的工作区,指令都要经过栈弹出数据进行运算,一般的iload,istore等指令就是push和pop;帧数据区主要是支持常量池解析、正常方法返回以及异常派发机制;
  15. 本地方法栈:线程调用一个本地方法时,本地方法接口使用本地方法栈;
  16. 执行引擎:执行指令,通用技术有解释、即时编译、自适应优化和芯片级执行,Sun的hotspot使用自适应优化:刚开始对所有代码解释运行,监视代码运行情况,把经常执行的代码编译为本地代码,优化,然后继续执行。

posted on 2012-09-07 14:57 changedi 阅读(426) 评论(0)  编辑  收藏 所属分类: Java技术


只有注册用户登录后才能发表评论。


网站导航: