美文网首页
浅谈Java理解,开放性题目浅析

浅谈Java理解,开放性题目浅析

作者: 坑王老薛 | 来源:发表于2018-08-09 23:05 被阅读356次

    本内容系原创内容,转载请注明出处:https://www.jianshu.com/p/c556c9cc060b

    浅析对于JAVA的理解

    从接触JAVA到现在,不敢说对于JAVA有多了解,但是也可以算上初窥门径。很多时候,
    我们都会碰到一些开放性的面试题,那么在这里我通过这个题目作为一个引子,一起
    分析以及解答一下JAVA为什么让我们这么又爱又恨。
    

    为了能够很好的表述这个问题,我会从以下几个方面简述这个问题。当然这个问题太大了,我尽量在保证用词准确的基础上做到有深度,有广度简单易懂

    • 语言本身特性
    • JDK包含的常见工具
    • 类加载机制
    • Write Once,Run anyWhere

    语言本身特性:

    之所以先聊特性,是因为这个东西比较简单。Java的特性很清楚能够表述清楚:

    Java语言特性

    java语言的特性,包括泛型,面向对象,泛型,反射,Lamdba等;
    也包含了一些基础类库,集合,IO/NIO,网络,并发,安全等基础类库。

    JDK包含的常见工具

    JDK中包含的常见工具比如:编译器,运行时环境,安全工具,诊断和监控工具等等。

    常见工具

    接下来是我罗列的这些常见的工具的使用方式,可能比较无聊,大家也可以直接跳过。认识即可。

    jar.exe:

    作用:生成jar包

    jar cvf d:/test.jar e:/review/coreJava/Employee.class

    表示将目录e:/review/coreJava下面的Emlopyee.class生成jar文件并存放在d盘下面的test.jar里面。

    sjavac:

    jdk9之后才有的,这里还有比如辅助工具的jlink也是jdk9之后才有的。

    作用: In addition to the timestamps sjavac inspects the public API of the dependencies to judge which files need to be recompiled.。sjava代替了javac时间戳之外,sjavac还会检查依赖项的公共API,以判断哪些文件需要重新编译。感觉和JIT搭配着使用。目前这个先做为一个新的坑,后期填补一下。嘿嘿。

    jstack:

    作用:针对活着的进程做本地的或远程的线程dump;

    jstack [ option ] pid

    查看配置信息的java进程id是否dump。

    类加载机制

    关于类加载机制的内容,目前市面上也很多。这里我列举的深入理解java虚拟机书中对于类加载机制的大致过程:
    加载->验证->连接->初始化。
    其实关于这一方面,我会在后续着重分享,所以现在先埋个坑。①此处是坑1。

    Write Once,Run anyWhere

    接下来我们花点篇幅好好研究一下这句话,这也应该是java的核心内容了。
    这句话直译过来书写一次,随处运行。通过这句话有几个问题,需要思考一下?

    1. Java是编译型?还是解释型?

    jvm跨平台原理简单解析

    这里先通过一个小例子说明一下编译型和解释性的区别:
    我们可以理解解释型就是同传(同声传译),编译型就是放录音。
    
    简单版本跨平台原理

    手绘版的有点粗糙。这里我简单介绍一下一个.java文件到底是如何一步一步做到跨平台的,然后这里会暴露出那些问题,然后java是如何解决这个问题的。

    首先通过javac编译成为字节码文件(bytecode),然后不同平台会安装于平台对应的不同的JVM。JVM的类加载器开始加载字节码文件,通过解释器逐行执行解释执行。所以这里就暴露出来一个问题,就是太慢了,本身.java文件已经多了一步编译.class文件的过程,其次现在又有解释执行对应的字节码文件。
    所以Java为了解决这一问题,将有些代码和方法是高频使用的和调用的,这些也就是所谓的热点代码,通过JIT(just in time compile)【即时编译器】,编译成为与本地平台相关的机器码。注意这个操作是在运行时将热点代码编译成为机器码,所以这种情景下就不能说是解释执行了,而是编译执行。
    当然这里也会出现另一个问题,就是JIT在操作是时比如要做JIT预热等操作,而这些是会一些额外的开销的,jdk9引入了AOT(ahead of time compilation)。这是一种新的编译方式。直接将字节码编译成为机器码,而且新增加了jaotc工具,可以将某个类或者是9中给我提供的模块编译为AOT库。

    编译成为机器码
    jaotc --output LibHelloWorld.so HelloWorld.class
    启动指定
    java -XX:AOTLibray=./LibHelloWorld.so,./ HelloWorld.class
    

    备注:

    热点代码,或者说JIT是有存在的价值的,因为热点代码编译的设计,是因为绝大多数的
    程序都表现了`小部分的热点耗费了大量的资源`。基于这个推论,在某些场景下,一个需要
    跑在运行时上的语言,才能比直接编译成为机器码的语言更快。所以有时候我们说Java
    在某些情景下要比C还快。
    

    垃圾回收机制

    关于垃圾回收机机制,这里埋下第二个坑。
    比如常见的垃圾回收器:CMS,G1,ParallelGC等
    比如常见的对象引用关系:强、软、弱、虚 之间的关系等等,我们后续在继续分享
    

    相关文章

      网友评论

          本文标题:浅谈Java理解,开放性题目浅析

          本文链接:https://www.haomeiwen.com/subject/dxxhbftx.html