- 浏览: 3052446 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
这个月第一个周五和今天分别做了次Java/JVM的分享。没做新的演示稿了,之前那个巨型演示稿已经堆积得太臃肿,不适合用来做演示用。这两次都是只用很简单的本文脉络串起话题,然后把具体的讲解写在白板上。头一次效果还行,今天这次讲的内容还是枯燥了点,下面的同志们闷得睡着了一片。要讲好的话,我还需要继续花精力探索怎样的话题、怎样的深度才适合大范围的受众。
关键是:有些知识,知道了又如何?既然不能直接应用在“调优”之类的很现实的方面,那知道了没意义。但调优工作越是深入就越需要坚实的基础。呜……
话说,总觉得跟一个有C++背景的人提到vtable啥的时候都很轻松,跟只有Java背景的人讲解就麻烦不少,其实概念不难吧?Hmm
分享概要1: 2010-09-03
分享概要2: 2010-09-17
有个组预订了10月13号下午的一次,这次我不准备讲JVM了,讲讲茴字的四种写法……
大概会用计算器,或者说表达式语言(EL)为例来简单介绍语言实现的一些方式吧。大概。
其实是一直很想的。开高级语言虚拟机圈子也是想更系统的整理这类资料。但很可惜现实是没足够精力来整理…开专栏只怕会烂尾 T_T
如果你说的是Java语言,在Sun的HotSpot上跑的话,嗯是的。不只是字符串字面量,类型名、方法名、方法描述符、字段名等也都以字符串形式放在perm gen上。
在HotSpot里的话,某个对象的vtable是分配在该对象的类(klass)对象里的,如上图。HotSpot里的klass中vtable里存的是方法对象(methodOopDesc),方法对象里有“方法入口”属性来完成虚方法分派的最后一步。vtable是在类加载的时候计算出来的。之前写了一帖涉及到了HotSpot中的对象布局,不过vtable和itable的部分没讲。有兴趣的话可以参考官网文档,VirtualCalls
String s = "";这种方式声明的String对象是不是都在perm gen上分配?
在HotSpot里的话,某个对象的vtable是分配在该对象的类(klass)对象里的,如上图。HotSpot里的klass中vtable里存的是方法对象(methodOopDesc),方法对象里有“方法入口”属性来完成虚方法分派的最后一步。vtable是在类加载的时候计算出来的。之前写了一帖涉及到了HotSpot中的对象布局,不过vtable和itable的部分没讲。有兴趣的话可以参考官网文档,VirtualCalls
关键是:有些知识,知道了又如何?既然不能直接应用在“调优”之类的很现实的方面,那知道了没意义。但调优工作越是深入就越需要坚实的基础。呜……
话说,总觉得跟一个有C++背景的人提到vtable啥的时候都很轻松,跟只有Java背景的人讲解就麻烦不少,其实概念不难吧?Hmm
分享概要1: 2010-09-03
引用
1. 语言处理器 语言实现: 编译器 -> 静态链接器 -> 装载器 -> 动态链接器 -> 执行 对应到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
分享概要2: 2010-09-17
引用
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
评论
11 楼
txm119161336
2018-04-10
allocatestlye1 顺序为
// Fields order: longs/doubles, ints, shorts/chars, bytes, oops
但是实际测试下来,
int 会排序在long 之前,这是怎么回事?
// Fields order: longs/doubles, ints, shorts/chars, bytes, oops
但是实际测试下来,
int 会排序在long 之前,这是怎么回事?
10 楼
RednaxelaFX
2010-09-29
gstarwd 写道
期待sajiaGG下次的分享~~下次会侧重哪些方面呢?
有个组预订了10月13号下午的一次,这次我不准备讲JVM了,讲讲茴字的四种写法……
大概会用计算器,或者说表达式语言(EL)为例来简单介绍语言实现的一些方式吧。大概。
9 楼
gstarwd
2010-09-29
期待sajiaGG下次的分享~~下次会侧重哪些方面呢?
8 楼
sohuexe
2010-09-25
有毅力的话可以出书啊!既是压力也是动力,希望这样的书能在jdk7之前出来!
7 楼
RednaxelaFX
2010-09-22
phz50 写道
我觉得你可以出个专栏,系统讲解jvm,零零碎碎的文章感觉看的云里雾里的,当然我是cai niao,呵呵,不过还是出个专栏把,由浅入深,照顾一下我们这些新手吧。
其实是一直很想的。开高级语言虚拟机圈子也是想更系统的整理这类资料。但很可惜现实是没足够精力来整理…开专栏只怕会烂尾 T_T
6 楼
phz50
2010-09-22
我觉得你可以出个专栏,系统讲解jvm,零零碎碎的文章感觉看的云里雾里的,当然我是cai niao,呵呵,不过还是出个专栏把,由浅入深,照顾一下我们这些新手吧。
5 楼
RednaxelaFX
2010-09-22
QM42977 写道
String s = "";这种方式声明的String对象是不是都在perm gen上分配?
如果你说的是Java语言,在Sun的HotSpot上跑的话,嗯是的。不只是字符串字面量,类型名、方法名、方法描述符、字段名等也都以字符串形式放在perm gen上。
4 楼
QM42977
2010-09-20
RednaxelaFX 写道
QM42977 写道
你写的文章很棒,已经定阅了,我要好好学习!
请教一个问题:方法表是怎样分配的?
请教一个问题:方法表是怎样分配的?
在HotSpot里的话,某个对象的vtable是分配在该对象的类(klass)对象里的,如上图。HotSpot里的klass中vtable里存的是方法对象(methodOopDesc),方法对象里有“方法入口”属性来完成虚方法分派的最后一步。vtable是在类加载的时候计算出来的。之前写了一帖涉及到了HotSpot中的对象布局,不过vtable和itable的部分没讲。有兴趣的话可以参考官网文档,VirtualCalls
String s = "";这种方式声明的String对象是不是都在perm gen上分配?
3 楼
RednaxelaFX
2010-09-19
QM42977 写道
你写的文章很棒,已经定阅了,我要好好学习!
请教一个问题:方法表是怎样分配的?
请教一个问题:方法表是怎样分配的?
在HotSpot里的话,某个对象的vtable是分配在该对象的类(klass)对象里的,如上图。HotSpot里的klass中vtable里存的是方法对象(methodOopDesc),方法对象里有“方法入口”属性来完成虚方法分派的最后一步。vtable是在类加载的时候计算出来的。之前写了一帖涉及到了HotSpot中的对象布局,不过vtable和itable的部分没讲。有兴趣的话可以参考官网文档,VirtualCalls
2 楼
QM42977
2010-09-18
你写的文章很棒,已经定阅了,我要好好学习!
请教一个问题:方法表是怎样分配的?
请教一个问题:方法表是怎样分配的?
1 楼
lwwin
2010-09-18
诶, 啥时候我也跑来听你将讲课来~
基础差,就怕听不懂^-^~ 但是觉得会很好玩~
基础差,就怕听不懂^-^~ 但是觉得会很好玩~
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16288以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10465先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22407(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21884之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48394刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
在上述提供的文件信息中,我们看到一系列关于Java虚拟机(JVM)的知识点。文件主要包括一个链接指向视频资源、云析学院的讲师信息、以及课件的主要内容概要。内容概要被分为三个部分:基础篇、高级篇和优化篇,并...
以下是关于2023年Java知识点的概要: 1. **Java版本**:Java分为J2SE(Java Standard Edition)、J2EE(Java Enterprise Edition)和J2ME(Java Micro Edition)。J2SE是标准版,适用于桌面应用和商务应用开发;...
### Java的概要介绍与分析 #### Java编程语言概述 Java是一种高级编程语言,自1995年由Sun Microsystems发布以来,迅速获得了广泛的认可,并在多个领域占据主导地位。Java最大的特点是“一次编写,到处运行”...
7. **布尔常量**:在Java中,布尔类型仅有`true`和`false`两种。 8. **变量作用域**:变量在特定区域内有效,如成员变量、局部变量、方法参数和异常处理参数作用域。 9. **数据类型转换**:Java支持隐式和显式类型...
Java语言特别适合于Internet应用开发,并且具有“一次编写,处处运行”的跨平台特性,使其成为网络时代最重要的编程语言之一。 Java语言的诞生源于对一种独立于平台的编程语言的需求,这种语言可以编写出能在各种...
- **平台无关性**:采用JVM(Java虚拟机)确保“一次编写,到处运行”。 - **健壮性**:强大的异常处理和垃圾回收机制。 - **安全性**:内置安全特性,防止恶意代码执行。 - **可移植性**:能够在不同平台上运行,...
而Java Application直接通过JVM运行。 13. 八进制整数表示:八进制数以0开头,因此0144是八进制数。 14. 正确的变量声明:Java中,float后必须跟随小数点或指数表示浮点数,因此选项A错误;byte变量的取值范围是-...
#### 一、Eclipse概要简介 - **定义与特点**:Eclipse是一个开源的、基于Java的可扩展开发平台。它提供了一个框架和服务集合,用于通过插件构建定制化的开发环境。Eclipse本身的核心功能较小,其强大的功能主要依赖...
#### 一、大数据分析框架概要与Spark课程学习计划 在大数据时代,高效处理海量数据成为企业和组织的核心需求之一。Spark作为当前最受欢迎的大数据分析框架之一,以其高性能、易用性等特点受到广泛青睐。本章节将...
切换到“执行流”界面,添加“Sign-On Password”和“Sign-On User Name”两个测试用例: 右键选择“Sign-On User Name”,选择“测试运行计划” 新建执行条件: 设置“Sign-On User Name”的时间...