疯狂Java讲义(一)

疯狂Java讲义(一)

 1.编译型语言和解释型语言的区别

        Java语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。

有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(Windows 下的 .exe)(有一个成品,以后也可以使用),比如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言称为编译型语言,使用的转换工具称为编译器。

有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell、MATLAB 等,这种编程语言称为解释型语言,使用的转换工具称为解释器。

类型 原理 优点 缺点
编译型语言 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(以可执行文件的形式存在)。 编译一次后,脱离了编译器也可以运行,并且运行效率高。 可移植性差,不够灵活。
解释型语言 由专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码。 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 一边执行一边转换,效率很低。

疯狂Java讲义(一)

分析

回过头来看Java,我们知道,Java代码执行前需要先编译成class文件,再交由JVM执行。因此从这一过程来看,Java可以称之为编译型语言。

然而,class文件的内容属于一种中间语言,计算机无法直接识别,仍然需要由JVM解释成机器语言执行,因此这个角度来说,可以称之为解释型语言。

 疯狂Java讲义(一)

 2.通过JVM实现跨平台

       Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM (Java Virtual Machine)。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。

       当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。不同平台上的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”,只有通过中间的转换器才可以实现,JVM 就是这个转换器。

       JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。

疯狂Java讲义(一)

  • Oracle公司制定的Java虛拟机规范在技术上规定了JVM的统-标准,具体定义了JVM的如下细
    节:
    ➢指令集
    ➢寄存器
    ➢类文件的格式
    ➢栈
    ➢垃圾回收堆
    ➢存储区
    Oracle公司制定这些规范的目的是为了提供统一的标准, 最终实现Java程序的平台无关性

3.javac编译程序为什么不需要指定目标文件的文件名

javac编译程序

疯狂Java讲义(一)

疯狂Java讲义(一)

java 解释运行程序

疯狂Java讲义(一)

4.java源文件的命名规则

疯狂Java讲义(一)

 疯狂Java讲义(一)

 5.JDK9新增的jshell工具

        JDK 9工具的一大改进就是提供了jshell 工具,它是一个REPL (Read-Eval-Print Loop)工具,该工具是一个交互式的命令行界面,可用于执行Java 语言的变量声明、语句和表达式,而且可以立即看到执行结果。因此,我们可以使用该工具来快速学习Java或测试Java的新API。
        对于一个立志学习编程(不仅是Java)的学习者而言,一定要记住:看再好的书也不能让自己真正掌握编程(即使如《疯狂Java讲义》也不能)!书只能负责指导,但最终一定需要读者自己动手。即使是一个有经验的开发者,遇到新功能时也会需要通过代码测试。
        在没有jshell时,开发者想要测试某个新功能或新API,通常要先打开IDE工具(可能要花1分钟),然后新建一个测试项目,再新建一个类,最后才可以开始写代码来测试新功能或新API。这真要命啊!而jshell 的出现解决了这个痛点。
        开发者直接在jshell界面中输入要测试的功能或代码,jshell 会立刻反馈执行结果,非常方便。启动jshell非常简单,只要在命令行窗口输入jshell 命令,即可进入jshell交互模式。

疯狂Java讲义(一)

 疯狂Java讲义(一)

 6.Java 9 的G1垃圾回收器

  内存泄漏

        传统的C/C++等编程语言,需要程序员负责回收已经分配的内存。显式进行垃圾回收是一件比较困难的事情,因为程序员并不总是知道内存应该何时被释放。如果一些分配出去的内存得不到及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这种现象被称为内存泄漏

  显式进行垃圾回缺点

  • 程序忘记及时回收无用内存,从而导致内存泄漏,降低系统性能。
  • 程序错误地回收程序核心类库的内存,从而导致系统崩溃。

  垃圾回收

        Java语言不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE在后台自动进行的。JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收(GarbageCollection,GC)

        Java的堆内存是一个运行时数据区,用以保存类的实例(对象),Java虚拟机的堆内存中存储着正在运行的应用程序所建立的所有对象,这些对象不需要程序通过代码来显式地释放。一般来说,堆内存的回收由垃圾回收器来负责,所有的JVM实现都有一个由垃圾回收器管理的堆内存。垃圾回收是一种动态存储管理技术,它自动释放不再被程序引用的对象,按照特定的垃圾回收算法来实现内存资源的自动回收功能。

疯狂Java讲义(一)

散称知识点:

  • Java标准版开发包 JDK(Java SE Development Kit)包含 Java运行时环境 JRE(Java Runtime Environment)包含JVM。
  • 疯狂Java讲义(一)
  • 疯狂Java讲义(一)
  • 学生提问:为什么选择用户变量?用户变量与系统变量有什么区别?

         答:用户变量和系统变量并没有太大的差别,只是用户变量只对当前用户有效,而系统变量对所有用户有效。为了减少自己所做的修改对其他人的影响,故设置用户变量避免影响其他人。对于当前用户而言,设置用户变量和系统变量的效果大致相同,只是系统变量的路径排在用户变量的路径之前。这可能出现一种情况:如果Path 系统变量的路径里包含了java 命令,而PATH用户变量的路径里也包含了java命令,则优先执行Path系统变量路径里包含的iava命令。

上一篇:Centos7下psutil安装报错:error: command ‘gcc’ failed with exit status 1


下一篇:python 模块之 psutil 查看系统性能信息