最近做的两次Java/JVM分享的概要

这个月第一个周五和今天分别做了次Java/JVM的分享。没做新的演示稿了,之前那个[url=http://rednaxelafx.iteye.com/blog/656951]巨型演示稿[/url]已经堆积得太臃肿,不适合用来做演示用。这两次都是只用很简单的本文脉络串起话题,然后把具体的讲解写在白板上。头一次效果还行,今天这次讲的内容还是枯燥了点,下面的同志们闷得睡着了一片。要讲好的话,我还需要继续花精力探索怎样的话题、怎样的深度才适合大范围的受众。

关键是:有些知识,知道了又如何?既然不能直接应用在“调优”之类的很现实的方面,那知道了没意义。但调优工作越是深入就越需要坚实的基础。呜……

话说,总觉得跟一个有C++背景的人提到vtable啥的时候都很轻松,跟只有Java背景的人讲解就麻烦不少,其实概念不难吧?Hmm

分享概要1: 2010-09-03
[quote]
  语言实现: 编译器 -> 静态链接器 -> 装载器 -> 动态链接器 -> 执行
对应到Java的一般实现形式是怎样的?
编译器: Java源码编译器(javac、ecj等)
静态链接器: 不存在
装载器+动态链接器: 类加载器
执行: Java虚拟机的执行引擎

2. Java源码编译器
最重要的数据结构:抽像语法树
抽像语法树与语法的关系
抽像语法树与“栈”的关系

3. Class文件
元数据
字节码 <- 基于栈的体系结构(0地址形式的指令集)

4. Java虚拟机的基本结构
主要组成部分: 类加载器, 自动内存管理器, 执行引擎, 运行时支持(包括线程管理等), 本地接口
Java虚拟机的类型系统
Java虚拟机中校验器使用的类型系统

5. Java虚拟机的执行引擎
执行引擎负责执行字节码
字节码指令种类:
局部变量读/写
算术与类型转换
对象与数组的创建和操作
栈操作(操作数栈)
条件/无条件跳转
方法调用
抛出异常
同步

6. Java虚拟机中的存储空间
存储空间的一般分类: 静态存储, 半静态存储 -- 栈, 动态存储 -- 堆
如何分配空间:
在连续的空间中分配
在链式结构构成的空间中分配

Java虚拟机栈: 每个Java线程有一个
Java堆: 所有Java线程共享一个
方法区: 所有Java线程共享一个,存储“静态”数据与元数据
运行时常量池: 每个类/接口对应一个,记录元数据/符号表
本地方法栈

7. Java虚拟机中数据的表示
原始类型的值
引用类型的变量: 引用
引用类型的值: 对象/数组的数据
“变量a占用了多少空间?变量a指向的对象占用了多少空间?”

8. Demos, Q & A[/code][/quote]

分享概要2: 2010-09-17
[quote][code="">1. 内存管理
1.1 内存布局(memory layout)
操作系统提供的内存布局
虚拟内存系统(virtual memory)
用户地址空间布局(user address space layout) / 内核地址空间布局(kernel address space layout)
两步式分配: reserve - commit
Demo: windbg / vadump
进程的地址空间组成
保护区域
代码(code)
调用栈(thread stack / C stack / control stack)
全局变量
堆(heap / C heap)
HotSpot中Java栈与本地方法栈的关系
HotSpot使用操作系统的本地线程来实现Java线程
其中每个Java线程的Java栈与本地方法栈也共用同一个操作系统提供的线程栈实现
HotSpot的堆与GC堆的关系
HotSpot有内部数据结构也在堆(C heap)上分配
从Java一侧看到的GC堆是这些内部数据结构的一部分;也就是,GC堆是HotSpot的堆(C heap)的一部分
NIO的direct buffer从HotSpot角度看是在堆上的(C heap),但从Java角度看不在堆上(GC heap)
所以也叫“不在堆上的”(off heap)空间,这里的堆是指Java一侧看到的GC堆
HotSpot的GC堆的布局
除G1外,HotSpot的GC堆的布局都是 (Eden + Survivor Space × 2) + Tenured + Permanent
Demo: Visual GC
1.2 空间分配
连续内存空间中的空间分配: bump-the-pointer
e.g. C stack
非连续空间中的空间分配: freelist
1.3 对象布局
HotSpot中的Java对象布局
双字对象头(2-word object header)
8字节对齐
FieldsAllocationStyle
0: Fields order: oops, longs/doubles, floats/ints, shorts/chars, bytes
1: Fields order: longs/doubles, floats/ints, shorts/chars, bytes, oops
CompactFields

Demo: Unsafe.objectFieldOffset()

2. 方法调用
2.1 一些术语
方法(method)
消息(message)
选择器(selector) / 方法名+签名(signature)
消息传递(message send) / 方法调用(method invocation)
接收者(receiver)
调用点(callsite)
2.2 静态选择与动态分派
静态选择(static method resolution)
非虚方法可以静态确定单一实现版本
虚方法可以静态确定重载版本,但无法确定实现版本
Java语言规范第3版 8.4.9
When a method is invoked (§15.12), the number of actual arguments
(and any explicit type arguments) and the compile-time types of the
arguments are used, at compile time, to determine the signature
of the method that will be invoked (§15.12.2). If the method that
is to be invoked is an instance method, the actual method to be
invoked will be determined at run time, using dynamic method lookup
(§15.12.4).
动态分派(dynamic method dispatch)
2.3 单分派与多分派
单分派(single dispatch)
多分派(multiple dispatch)
2.4 Java中虚方法分派的本质
签名 -> 接收者类型 -> (类型 × 签名 -> 方法) -> 方法
2.5 虚方法的动态分派的几种实现方式
最原始的查表
虚方法表(virtual method table, vtable)
内联缓存(inline cache)
单态内联缓存(monomorphic inline cache)
多态内联缓存(polymorphic inline cache)
超多态的情况(megamorphic)
2.6 JVM的5个方法调用指令
invokestatic
invokespecial
invokevirtual
invokeinterface
invokedynamic (*)
2.7 方法内联(method inlining)
关键是在某个调用点“唯一确定的实现版本”
非虚方法必然只有一个实现版本
类层次分析(class hierarchy analysis)
虚方法也可以被证明只有一个实现版本
优点:可以削除方法调用的开销,更重要的是为编译器的其它优化提供机会
缺点:有潜在的代码膨胀(code bloat)的危险

3. Demos, Q & A
[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值