[讨论] 自由讨论帖/建议帖/资料补充帖/马克帖(谢绝纯水)

stevenlye 2013-07-22
下面的代码是ClassFileParse.cpp文件中的parse_constant_pool_entries方法中的一部分:
// first verification pass - validate cross references and fixup class and string constants
  for (index = 1; index < length; index++) {          // Index 0 is unused
    jbyte tag = cp->tag_at(index).value();
    switch (tag) {
      case JVM_CONSTANT_Class :
        ShouldNotReachHere();     // Only JVM_CONSTANT_ClassIndex should be present
        break;
      case JVM_CONSTANT_Fieldref :
        // fall through
      case JVM_CONSTANT_Methodref :
      ......

请问这个verification主要是做什么的?还有就是switch中tag应该会有JVM_CONSTANT_Class匹配的吧,但这种情况里面怎么会是ShouldNotReachHere();呢,搞不明白,求指点啊~~
stevenlye 2013-07-23
RednaxelaFX 写道
stevenlye 写道
请问handle与oop、klass的关系具体是怎样的?handle的作用是什么?

我之前在这里写过了,请参考:http://rednaxelafx.iteye.com/blog/1044951

也就是说Hotspot里面用OopMap和handle来实现准确式GC,那么OopDesc中的_Mark里面也会有GC管理相关的信息,它们之间各有什么不同呢?
RednaxelaFX 2013-07-24
stevenlye 写道
下面的代码是ClassFileParse.cpp文件中的parse_constant_pool_entries方法中的一部分:
// first verification pass - validate cross references and fixup class and string constants
  for (index = 1; index < length; index++) {          // Index 0 is unused
    jbyte tag = cp->tag_at(index).value();
    switch (tag) {
      case JVM_CONSTANT_Class :
        ShouldNotReachHere();     // Only JVM_CONSTANT_ClassIndex should be present
        break;
      case JVM_CONSTANT_Fieldref :
        // fall through
      case JVM_CONSTANT_Methodref :
      ......

请问这个verification主要是做什么的?

主要是看常量池项之间的引用是否越界,没越界的话引用的类型对不对。
例如说一个常量池如果最大编号就是10,而有一个常量池项引用了编号为11的项,那就越界了;又例如本来一个CONSTANT_Class引用的项应该是一个CONSTANT_Utf8,如果发现实际引用的项不是这个类型的,也要报错。就是这个初步的校验而已。

stevenlye 写道
还有就是switch中tag应该会有JVM_CONSTANT_Class匹配的吧,但这种情况里面怎么会是ShouldNotReachHere();呢,搞不明白,求指点啊~~

因为前面在ClassFileParser::parse_constant_pool_entries()里面遇到JVM_CONSTANT_Class时往constantPool里放的是JVM_CONSTANT_ClassIndex标记,这是在构建constantPool过程中用的一个临时标记。注释里写得很明白。String也是同理。
  // For temporary use while constructing constant pool
  void klass_index_at_put(int which, int name_index) {
    tag_at_put(which, JVM_CONSTANT_ClassIndex);
    *int_at_addr(which) = name_index;
  }


stevenlye 写道
RednaxelaFX 写道
stevenlye 写道
请问handle与oop、klass的关系具体是怎样的?handle的作用是什么?

我之前在这里写过了,请参考:http://rednaxelafx.iteye.com/blog/1044951

也就是说Hotspot里面用OopMap和handle来实现准确式GC,那么OopDesc中的_Mark里面也会有GC管理相关的信息,它们之间各有什么不同呢?

这一系列问题都挺具体的,您要不专门开一帖来讨论?

HotSpot VM在实现serial GC的mark-sweep-compact算法时借用了oopDesc里的_mark的一位来记录对象是否已经被标记;其它GC不使用这个mark bit。

在使用这个mark bit的时候,它只表明该对象是否已经被标记,但不记录该对象内部哪些位置上存有引用。OopMap保存的正是某个对象内什么地方有引用。标记是一个递归的过程,标记了一个对象之后,要把该对象内部的引用所指向的对象也标记上。
stevenlye 2013-07-24
好的,以后具体的问题我来开个源码学习的帖吧~~
这里还有个关于你那个ppt里面的一张图,不是太明白其意思。。。
[img][/img]
本地图片怎么上传呢?

那个pdf的ppt里面的第122页就画了一个instanceOopDesc与几个klassOopDesc在一起的大图,这个图是它们在内存中的顺序吗?不是很清楚这样画的顺序是有什么含义在里面。

还有双亲委托模型中,我们自己写的应用程序在加载时它的parent加载器直接是null吗?还是被默认指定为AppClassLoader呢?
RednaxelaFX 2013-07-25
stevenlye 写道
好的,以后具体的问题我来开个源码学习的帖吧~~

欢迎开帖,到时候把你已经学到的东西和还抱有的疑惑整理发出来,会对其它同好很有帮助的。

stevenlye 写道
这里还有个关于你那个ppt里面的一张图,不是太明白其意思。。。
[img][/img]
本地图片怎么上传呢?

ItEye的群组论坛把图片上传功能给禁用了。可以在自己的ItEye博客的相册里先把图片上传了,然后再在这边用img标签把图片地址贴出来。

stevenlye 写道
那个pdf的ppt里面的第122页就画了一个instanceOopDesc与几个klassOopDesc在一起的大图,这个图是它们在内存中的顺序吗?不是很清楚这样画的顺序是有什么含义在里面。

122页的图就是把121页的图放回到线性地址空间里的示意图。想说明的事情是Java对象在HotSpot VM里也是实际存在于内存里的,每个对象都有起始地址,按地址大小顺序排开就是122页的图。

要注意这些地址都是“虚拟内存”意义上的地址,不是“物理内存地址”。千万千万要注意别把这俩概念弄混了。

stevenlye 写道
还有双亲委托模型中,我们自己写的应用程序在加载时它的parent加载器直接是null吗?还是被默认指定为AppClassLoader呢?

Parent delegation机制的parent是在创建ClassLoader实例时指定的。系统内建的ClassLoader的parent关系是显式传参数指定的:extension class loader的parent是null(也就是bootstrap class loader);system class loader的parent指定为extension class loader。参考这里的第79行:http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/1a0501c10b17/src/share/classes/sun/misc/Launcher.java

自定义ClassLoader的话,就看你传什么参数给构造器了。如果不指定parent,则默认的parent为创建这个ClassLoader实例的线程的线程上下文ClassLoader;如果显式传了null为parent,那parent就是bootstrap class loader。
RednaxelaFX 2013-09-09
JVMLS 2013

Videos on Oracle Media Network: http://medianetwork.oracle.com/search/results?q=jvmls

One VM to Rule Them All
video slides

OpenJDK at Google
video

JVM Bridge Methods
video

Packed Objects in Java
video

JSR 292 on Android
video

Nashorn War Stories
video

Fitting Nashorn on the JVM
video

=================================

JVMLS 2014

=================================

mrubyやKopiLuaにはなぜ文字連結用オペコードがあるの? ① (あるいはJavaの文字連結最適化について)

String Concatenation Optimization on Java Bytecode, Ye Henry Tian, 2006
Global site tag (gtag.js) - Google Analytics