• 啊一大狗 置顶
    2018-07-31
    这套课很好,谢谢!
    
     11
  • Tony
    2018-07-30
    同提建议,代码使用英文。刚学java基础时,有老师为了便于理解用中文命名。现在都来学jvm,对java很熟悉了,看到中文不仅不会觉得通俗易懂,反而特别别扭。

    作者回复: 多谢建议!

    原本是英文的,录音的时候觉得老要切换,就给换了。。

    
     48
  • C_love
    2018-07-30
    提个小建议,能否在代码中都使用英文?毕竟使用中文作对象名不值得提倡

    作者回复: 谢谢建议!

    
     18
  • 杨军
    2018-08-13
    一直不太理解一个问题:“Java的动态类型运行期才可知”,在编译期代码写完之后应该就已经确定了吧,比如A是B的子类,“B b = new B(); b= new A()”这种情况下b的动态类型是A,Java编译器在编译阶段就可以确定啊,为什么说动态类型直到运行期才可知?
    诚心求老师解惑,这个问题对我理解Java的动态绑定机制很关键-.-
     7
     15
  • godtrue
    2018-07-30
    1:虚方法
    方法重写的方法,可认为就是虚方法

    2:JVM怎么执行虚方法
    通过方法表,一个二维表结构,标示出类的类型、虚方法的序号。当调用虚方法的时候,先确定类型,再根据类型找方法
    
     11
  • lxz
    2018-08-02
    建议结合java代码及其对应的字节码来讲解,比如常量池,方法表在字节码中对应的位置,干讲一点印象也没有
    
     10
  • J
    2018-12-28
    win10:
    java -XX:CompileCommand=dontinline,*.exit Passenger 这样是对的
    java -XX:CompileCommand=‘dontinline,*.exit’ Passenger 这样是错的
    
     8
  • MARK
    2018-07-30
    没用过中文写代码,居然认为中文会编译错误T﹏T
    老师是为了课件方便这样写,自己写作业就改下呗,又没规定要每个字照抄
    [root@localhost cqq]# javac Passenger.java
    [root@localhost cqq]# java Passenger
    cost time : 1167
    cost time : 3156
    [root@localhost cqq]# java -XX:CompileCommand='dontinline,*.exit' Passenger
    CompilerOracle: dontinline *.exit
    cost time : 3709
    cost time : 7557
    展开

    作者回复: 哈,我以前也认为无法编译,直到有一次我看到一个俄语的方法名。。

    另外,如果你用javap -v查看常量池的话,你会发现类名方法名以及方法描述符都是用UTF8来存的。

    
     8
  • 杨春鹏
    2018-07-31
    关于单态内联缓存中的记录,hotspot采用了超多态。也就是如果该调用者的动态类型不是缓存中的类型的话,直接通过基于方法表来找到具体的目标方法。那么内联缓存中的类型是永久不变,一直是第一次缓存的那个调用者类型吗?
    
     7
  • 左岸🌸开
    2018-07-30
    为什么调用超类非私有实例方法会属于静态绑定呢?

    作者回复: 通过super关键字来调用父类方法,本意就是想要调用父类的特定方法,而不是根据具体类型决定目标方法。

     1
     6
  • Rain
    2019-01-14
    一直不太理解一个问题:“Java的动态类型运行期才可知”,在编译期代码写完之后应该就已经确定了吧,比如A是B的子类,“B b = new B(); b= new A()”这种情况下b的动态类型是A,Java编译器在编译阶段就可以确定啊,为什么说动态类型直到运行期才可知?
    诚心求老师解惑,这个问题对我理解Java的动态绑定机制很关键-.-


    @杨军,我的理解是,假设C是B的另外一个子类,你的上述两句代码有可能运行在多线程环境中。假设第二行代码运行之后切换到了另外一个线程中,且b = new C()
    这个情况下,线程再切换到你的那两行代码后面的时候就不一定是A了,刘必须要在运行过程中才能确定了。
    展开
     1
     4
  • 吾是锋子
    2018-08-14
    郑老师,您好。有个具体的问题想请教下,String类里面indexOf(String str)调用的是自己类里面indexOf(String str, int fromIndex)方法,但我自己在测试的时候却发现两个方法的速度有很明显的差异,看字节码也没有发现什么特殊。
    不知道是不是我忽略了什么,希望您能抽空点拨下,感谢!

    作者回复: HotSpot里有String.indexOf intrinsic,用了很多向量化指令,所以性能会快很多的。

    关于intrinsic的概念,你可以理解为HotSpot识别指定方法后,将其替代为语意等价的高效实现。

    
     4
  • 加久
    2019-01-31
    任何方法调用除非被内联,否则都会有固定开销。这些开销来源于保存程序在该方法中的执行位置,以及新建、压入和...

    命中内联缓存后,不用开辟新的栈帧了??
     2
     3
  • 方枪枪
    2018-08-01
    一直不能明确一个问题,执行哪个方法,是不是都是在运行的时候确定的,如果是的话,coding的时候,写一个不存在的方法or传入不存在的参数,编译会报错,那这个合法性的检测,是一个什么逻辑?另外关于方法的确定,对于Java来说,是按照传入的形参确定执行哪个重写的方法,对于 groovy 是按照实际类型确定执行哪个方法,这两个区别在JVM层面是如何实现的?

    作者回复: 合法性检测是根据编译器能找到的class文件来判定的。你可以在编译后,移除掉相应的class文件或者库文件,就会出现你所说的不存在的方法的情况了。

    第二个问题,在各自的编译器中已经作出区分了。在Java字节码中就只是根据类名,方法名和方法描述符来定位方法的。

    
     2
  • 和风暖林
    2018-07-30
    代码用汉语也挺好的呀。来这都是学jvm的,没有来学编码规范的吧……

    作者回复: 哈,多谢支持。不过汉语编程有个问题,没办法区分大小写,因此变量名和类名容易混淆

    
     2
  • 一步
    2019-12-22
    老师问一个概念性的问题: 虚方法 到底在指什么样的 方法?
    也就是什么样的方法,才叫做虚方法?

    作者回复: 可以被子类覆盖的方法。例如,某段程序调用父类的方法A.foo(),由于调用者(receiver)是子类B的实例,实际执行的是子类的同名同参数方法B.foo()。那么A.foo就是一个虚方法,因为你不知道会调到哪里去

    这是面向对象编程的一个重要概念,用来实现多态的

    
     1
  • 拯救地球好累
    2019-09-09
    动态绑定:根据调用者的动态类型,来确定虚方法调用的目标方法(JVM中通过方法表定位目标方法)
    方法表创建时间:链接时的准备阶段
    方法表数据结构:数组(每个数组元素指向一个当前类及其祖先类中非私有的实例方法)
    动态绑定过程:在解析过程中,访问栈上的调用者->读取调用者的实际类型->读取该类型的方法表->读取方法表中某个索引值所对应的目标方法
    内联缓存:通过缓存调用者的动态类型和该类型对应的目标方法以期加快动态绑定
    
     1
  • 寥若晨星
    2019-03-13
    我也建议老师变量名使用英文,因为习惯了,看到中文变量觉得别扭,反而增加了写入大脑缓存的时间哈哈哈
    
     1
  • godtrue
    2018-08-01
    3:缓存
    凡是需要提高性能的地方都需要使用,这个方法也是人类经常使用的方式,计算机中使用的也比较多,使用缓存的基本理念是,一将需要的东西提前加工好,二将加工好的东西放在获取速度更快更方便的地方

    4:内联缓存
    是JVM为了提高动态绑定或者根据动态的类类型找目标方法的一种方式,这是以空间换时间的优化思路,需要权衡利弊,视场景使用
    
     1
  • 礼貌
    2018-07-30
    汉语编程?

    作者回复: 哈,这个对于VM实现者来说可是feature,毕竟要存储UTF8。不过以后的代码会换到英文的。

    
     1
我们在线,来聊聊吧