本内容系原创内容,转载请注明出处: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的核心内容了。
这句话直译过来书写一次,随处运行
。通过这句话有几个问题,需要思考一下?
- 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等
比如常见的对象引用关系:强、软、弱、虚 之间的关系等等,我们后续在继续分享
网友评论