• 谈谈你对java平台的理解?


    问题:谈谈你对java平台的理解?java是解释执行,这句话对吗?
    典型回答:java本身是一种面向对象的语言,具有很好的跨平台的能力,能够做到“write once ,run anywhere”。另外就是GC机制,java通过垃圾回收器回收分配内存,程序员无需自己操心内寸的回收问题。
         我们日常会接触到jre和jdk。jre是java运行环境,包含了jvm和java类库等。jdk则是在jre的基础上提供了更多的工具,比如编译器,和一些诊断工具等。
         java是解释执行,这句话不是很准确。java代码在执行时,先通过javac编译为字节码bytecode,在运行时,通过jvm内嵌解释器转换为最终机器码。但常见jvm,比如Oracle JDK提供的Hotspot JVM,都提供了jit(just in time)动态编译器,能够在运行时将热点代码编译成机器码,这部分属于编译执行。
     
    对于这个问题,还有其他方面可以扩展,比如:
         java语言特性,包括泛型,lambda表达式等特性。
         基础类库,包含集合,IO/NIO,网络,并发,安全等。
         对于日常使用较多的类库,可以整理一下。
         jvm的知识和概念,如java类加载机制,常用版本jdk的内嵌Class-Loader,如Bootstap,Application,Extension Class-Loader,自定义Class-Loader等。还有GC机制,常见垃圾回收器如Serial GC,Paraller GC,CMS,G1等。
    如下图所示:
     
     
     
     
    关于解释执行和编译执行的问题,可以深入讨论一下。
         通常我们不是java分为编译期和运行时。java的编译期和C/C++是不同的,java编译生成的是.class字节码文件,而不是可以直接执行的机器码。
    java是通过字节码和jvm来实现一次编译,到处执行的。
         运行时,java通过类加载器Class-Loader加载字节码,解释或编译执行。主流jdk版本,如jJDK 8实际上是一中混合模式(Xmixed)。Oracle Hotspot JVM内置两个JIT编译器,C1对应对启动速度敏感的client模式,C2对应长时间运行的sever模式。默认采用分层编译(TieredCompilation)。
         虚拟机启动时可以指定不同参数对于运行模式进行选择。如使用-Xint只使用解释执行,不使用编译执行。这样的话摒弃了JIT编译器的性能优势。解释器是逐条读入,逐条解释执行的。-Xcomp参数是关闭解释器,这种模式会使jvm的启动慢得多。同时有些JIT优化方式,不进行profiling往往不能有效优化。
         Jdk9提供一种AOT(Ahead-of-Time compilation)的编译模式,直接将字节码编译成机器码。避免了JIT预热等方面的开销。
     
     
           
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    System.BadImageFormatException: Could not load file or assembly
    MSSQL数据库索引的应用
    快递api网接口快递调用方法
    winform的扩展的带有截图功能picturebox
    免费api大全
    C#使用百度API通过IP获取地理位置和坐标
    用淘宝ip地址库查ip
    开源相关社区/项目一览(备查,欢迎补充)(转)
    .NET系列文章——近一年文章分类整理,方便各位博友们查询学习(转)
    设计模式--状态模式C++实现
  • 原文地址:https://www.cnblogs.com/wangzepu/p/9351133.html
Copyright © 2020-2023  润新知