关于Java平台的一些理解(虚拟机执行引擎)

首先是java平台的两个特点:

1.一次编译,到处运行 :JVM帮助开发者屏蔽了操作系统层面上的细节,跨平台不需要重新编译

 2.自动垃圾回收:java的垃圾回收机制

    提到JVM不得不说Jre和Jdk,Jre是java的运行时环境,主要包含了JVM和java基础类库,而Jdk是jre的超集,里面包含了一些编译工具和调试分析工具

    java的代码执行分为两种,第一种是将源代码编译成字节码文件,然后再运行时通过解释器将字节码文件转为机器码执行(jdk8的模式),另一种是编译执行(直接编译成机器码)。在HotSpot虚拟机中内置了两个即时编译器(JIT)C1和C2,前者时Client Compiler。后者是Server Compiler,默认是采用某个解释器和其中一个编译器结合的模式,可以通过”-cilent“和”-server“参数设置。像上面描述那样的叫混合模式,可以通过”-Xint“强制进入纯解释器的模式,也可以通过”-Xcomp“进入编译器优先的模式。JIT技术是可以在运行时将热点代码的字节码直接编译成机器码而跳过解释的步骤。

    jdk9引入了AOT编译器在编译期直接将所有代码编译成机器码执行,可以实现直接把某个类库编译成二进制文件加速执行。(缺陷在于只支持Linux x64 java base)

    在Hotspot虚拟机里,采用基于计数器的方式确定热点代码,包括方法调用计数器和回边计数器(循环体内代码)

    分层编译策略:程序解释执行(不开启性能监控)可以触发C1编译,将字节码编译成机器码,可以进行简单优化,也可以加上性能监控,C2编译会根据性能监控信息进行激进优化。

    解释执行用于需要迅速启动和执行时,消耗时间短。且作为编译器激进优化的备份方案。而编译器是为了更好的优化代码,提高执行效率,但优化时间一般会比较长。

    C1和C2编译器从优化的程度上是不一样的,C1进行简单、可靠的优化,耗时短。C2进行耗时较长的优化,以及激进优化。但优化的代码执行效率更高。C1同时提供运行时性能监控信息。

    一般在代码触发编译条件以前会使用解释执行,随着运行的时间增长,当触发编译条件时,即时编译器会对代码进行编译,而触发编译器的条件是代码执行的次数够多(达到阈值)。解释执行也在编译器进行激进优化不成立的时候,作为逃生门对代码进行解释执行。

    在不同的编译器上有不同的优化策略,C1编译器上主要有方法内联,去虚拟化、冗余消除。

    方法内联就是将引用的函数代码编译到引用点处,这样可以减少栈帧的生成,减少参数传递以及跳转过程

    去虚拟化是对唯一的实现类进行内联

    冗余消除则是在运行期间把一些不会执行的代码折叠掉

    C2的优化主要是在全局层面,逃逸分析是优化的基础(运行时方法中的变量是否会被外部读取)。基于逃逸分析在C2上有如下几种优化:

    标量替换:用标量值代替聚合对象的属性值

    栈上分配:对于未逃逸的对象分配对象在栈而不是堆

    同步消除:清除同步操作,通常指synchronized


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.下列特点中,哪个是Java 虚拟机执行的特点之一? A、字节代码 B、多进程 C、静态连接 D、编译 2.Java语言的类型是 A、面向对象语言 B、面向过程语言 C、汇编程序 D、形式语言 3.下列哪个数代表单精度浮点数? A、0652 B、3.4457D C、0.298f D、0L 4.以下哪个表达式是不合法的 A、String x="Hello"; int y=9; x+=y; B、String x="Hello"; int y=9; if(x==y){} C、String x="Hello"; int y=9; x=x+y; D、String x=null; int y=(x!=null)&&(x.length()>0)? x.length():0; 5.main()方法的返回类型是: A、 int B、void C、boolean D、 static 6.下列对继承的说法,哪个是正确的? A、子类能继承父类的所有方法和状态 B、子类能继承父类的非私有方法和状态 C、子类只能继承父类public方法和状态 D、子类只能继承父类的方法,而不继承状态 7.下列关于构造方法的说法正确的是( )。 A、因为构造方法名与类名必须相同,构造方法在创建对象时被执行。 B、构造方法是给对象赋初值,所以没有返回值,必须用void来声明。 C、构造方法不能被程序调用,也不可以重载。 D、一个类只允许有一个构造方法。 8.若需要定义一个类域或类方法,应使用哪种修饰符? A、static B、package C、private D、public 9.如要抛出异常,应用下列哪种子句? A、catch B、throw C、try D、finally 10.对于catch 子句的排列,下列哪种是正确的? A、父类在先,子类在后 B、子类在先,父类在后 C、有继承关系的异常不能在同一个 try 程序段内 D、先有子类,其他如何排列都无关 11.计算中的流是? A、流动的字节 B、流动的对象 C、流动的文件 D、流动的数据缓冲区 12.以下哪个是java.io包中的一个兼有输入输出功能的类。 A、Object B、Serializable C、RandomAccessFile D、java.io中不存在这样的类 13.下面关于线程优先级的说法中,错误的是: A、Java中的线程的优先级有三个静态常量 B、新建线程的优先级默认为最低 C、优先级高的线程优先被执行 D、一个线程运行时,有可能被比它高优先级的线程抢占运行 14.下列方法中建议使用的是: A、stop() B、supend() C、resume() D、wait() 15.如果希望所有的控件在界面上均匀排序,就使用下列哪种布局管理器? A、BosLayout B、GridLayout C、BorderLayout D、FlowLayout 16.在一个MVC用户界面中,存在三个通讯对象,其中_________是指定的逻辑表示法。 A、模型 B、视图 C、控件 D、结构 17.applet类的直接父类是: A、Component类 B、Container类 C、Frame类 D、Panel类 18.下面关于沙箱模型的叙述中错误的是

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值