zoukankan      html  css  js  c++  java
  • 【鲲鹏来了】手把手教你在鲲鹏上使用编程语言——Java、Python

    之所以把这两种语言放到一起讨论,是因为在某些场景下,他们的行为非常相似。

    • 他们都通过源文件生成机器码
    • 他们都利用vm解释机器码完成程序运行

    在绝大多数场景下,Java编译生成的出来的机器码,是由JVM解释运行的;同样python会在运行时将源码编译成机器码,再由python来解释运行,我姑且把他俩都称为解释型语言。

    理论上,一个代码工程如果完全由JAVA或者python的源码与机器码构成,那么代码本身不关心自己所运行的芯片平台。

    但仍然有一些常用的天然特性其实是区分平台的,例如java中的NIO在linux上调用epoll,而windows上则调用了IOCP;python的绝大多数数学运算库,scipy、numpy中的核心算法部分都使用C、Fortran编写。而他们恰恰就是Java语言的主要应用场景——web应用和python语言的主要应用场景——AI/数学计算中最至关重要的部分。

    JAVA部分

    Java社区对Armv8指令集的支持相对完整,这里是JVM的支持体系列表,我们使用JDK 8时,就已经可以支持JVM的全部主要功能了。

       

    x86/64

    aarch64

    arm(32-bit)

    VMs

    Client

    Yes

    No

    Yes

     

    Server

    Yes

    Yes

    Yes

     

    Minimal

    Yes (32 bit)

    Yes, since JDK 12

    Yes

    JIT

    C1

    Yes

    Yes

    Yes

     

    C2

    Yes

    Yes

    Yes

     

    TieredCompilation

    Yes

    Yes

    Yes

     

    Graal JIT (Experimental)

    Yes, since JDK 10

    Yes, since JDK 11

    No

    GC

    SerialGC

    Yes

    Yes

    Yes

     

    ParallelGC

    Yes

    Yes

    Yes

     

    CMS

    Yes, Deprecated

    Yes, Deprecated

    Yes, Deprecated

     

    G1

    Yes

    Yes

    Yes

     

    ZGC

    Experimental

    In development

    No

    Runtime

    Container support

    Yes

    Yes

    Yes

     

    AppCDS

    Yes

    Yes, since JDK 10

    Yes, since JDK 10

     

    HugePages

    Yes

    Yes

    Yes

     

    Numa Support

    Yes

    Yes

    No

    Serviceability

    Java Flight Recorder

    Yes

    Yes, since JDK 11

    Yes, since JDK 11

    Table1 JVM端口功能对照表

    JAVA字节码在执行过程中,JIT会对热点的字节码进行优化编译,编译成机器码后存放在Code Cache区域。如果Code Cache区域满了,那么会导致部分或者全部的代码仅仅通过对字节码逐条解释运行,进而导致JAVA程序性能大减但主机和进程无任何明显的指标异常。由于Armv8是简单指令集,JAVA for Arm64的机器码的体积会数倍于X86,而且部分版本的JVM有Bug,一旦Code Cache满了,则所有的编译功能都会被停止。

    防止CodeCache满,需要调整JVM的一些扩展配置,以之相关的扩展配置项主要有:

    XXTieredCompilation      多级编译,OpenJDK 7与OracleJDK7 for Arm64版本默认是true,OpenJDK 7与OracleJDK 7for x86上是false,JDK8都是默认为true。由于默认开启了这个配置,会导致Code Cache中存放有多个层级的机器码,机器码体积倍增。关闭后JVM会只开启C2 Compilor线程进行机器码编译,大大降低Code Cache的消耗。

    XXReservedCodeCacheSize     默认值与JDK版本和平台有关,从48M到240M不等。对内存成本考虑不高的情况下,建议可以设置大一些,如512MB,这样可以有效防止因为Code Cache区域内存溢出导致JVM性能下降。

    Python部分

    python的开源社区比java的要松散许多,社区官方也没有意图收编很多看起来属于基本功能的模块,故而想要厘清python对Armv8指令集的支持情况其实非常困难,因为仅仅python本体能够支持Armv8并没有太大意义。粗浅的打个比方,python在如今的代码世界里,更多的是充当胶水,越来越多的功能其实不是由python native的代码编写。如果python生态中的许多功能模块不支持Armv8,空有一瓶好胶水其实也是没有用的。

    不过经过实测,使用python2.7.9、python3.5在鲲鹏服务器上运行完整的Openstack应用(Nova、Cinder、Swift、Glance、Neutron、Ceilometer等等),所有功能和测试用例都是正常的,因此可以相对乐观的认为,python2.7.9和python3在鲲鹏上的兼容性是具备的。

    转载自鲲鹏社区   作者:太一

  • 相关阅读:
    简单的NHibernate helper类,支持同一事务的批量数据处理
    外部唯一窗体
    Nhibernate常见的错误
    NHB下载地址
    oracle jdbc连接
    linux 中国发行版
    转:pl/sql develop的使用
    Oracle Database 10g Release 2 JDBC Drivers
    转:Setting up a Msysgit Server with copSSH on Windows
    oracle基础学习
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165089.html
Copyright © 2011-2022 走看看