ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

疯狂Java讲义(一)

2021-10-17 00:01:34  阅读:213  来源: 互联网

标签:Java 变量 jshell 疯狂 回收 内存 JVM 讲义


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

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

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

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

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

分析

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

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

 

 2.通过JVM实现跨平台

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

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

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

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

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

javac编译程序

java 解释运行程序

4.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交互模式。

 

 6.Java 9 的G1垃圾回收器

  内存泄漏

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

  显式进行垃圾回缺点

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

  垃圾回收

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

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

散称知识点:

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

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

标签:Java,变量,jshell,疯狂,回收,内存,JVM,讲义
来源: https://blog.csdn.net/indeedes/article/details/120774044

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有