JDK、JRE、编译指令和垃圾回收机制详解

JDK

  • 全称 Java SE Development Kit (Java 开发工具包)

  • JVM虚拟机:Java运行的地方

  • 核心类库:Java提前编好的东西

  • 开发工具: javac,java,jdb,jhat

    • javac:Java编译器,用于将Java源代码编译成Java字节码文件(.class)。

    • java: java虚拟机,用于运行字节码文件(.class)

    • jdb: java调试工具,用于debug

    • jhat:java分析工具,用于监测内存

    • ......

JRE

  • JRE全称 java Runtime Environment (Java运行时环境)。

  • JVM:Java虚拟机

  • 核心类库:Java提前编写好的东西

  • 运行工具

    • Java

    • ......

总结

JDK 包含 JER 包含 JVM

编译指令

# 将srcFile所指向的(.java)文件编译成字节码文件(.class) 到destdir指向的文件夹
javac -d destdir srcFile
#java -d . srcFile  (.)表示当前路径
#destdir 一定是一个文件夹地址( D:/Main.class)默认Main.class为文件夹
​
#java 执行命令后面接的是(Java类名)不是class文件的名称,也不是 Java 源文件
#名。
java Java类名
java - classpath dirl;dir2;dir3 .. .;dirN Java类
  • .java 源文件通常可以是任何名称,但是当类中有一个public时,文件名和类名必须相同

  • 所有javac 编译不需要指定文件名称只要路径

  • 默认文件名为源文件所定义的类名 如果一个.java文件有多个类那么就会为每个类创建.class

  • -classpath dirl;dir2;dir3 如果设置了classpath 环境变量 , Java 解释器将只在 CLASSPATH 环境变量所指定的系列路径中搜索 Java 类

###

jshell

JDK9 工具的大改进就是提供了 jshell 工具它是 REPL CRead-Eval-Print Loop (交互式的编程环境)工具 该工具是一个交互式的命令行界面,可用于执行 Java 语言的变量声明、语句 表达式,而且可以立即看 到执行结果 因此,我们可以使用该工具来快速学习 Java 或测试 Java 的新 API

常用命令
  1. /help:显示关于JShell命令的帮助信息。

  2. /reset:重置JShell,清除所有已输入的内容。

  3. /reload:重新加载JShell文件,使得最新的更改生效。

  4. /edit:编辑先前输入的代码片段。

  5. /list:列出当前定义的所有变量、方法和类。

  6. /vars:列出当前定义的所有变量。

  7. /methods:列出当前定义的所有方法。

  8. /types:列出当前定义的所有类和接口。

  9. /imports:列出当前导入的所有包和类。

  10. /exit:退出JShell。

Java的垃圾回收机制

  • Serial收集器:Serial收集器是一种单线程的垃圾回收器,它使用标记-复制算法来回收内存。适用于小型应用或者客户端应用。

  • Parallel收集器:Parallel收集器是Serial收集器的多线程版本,它也使用标记-复制算法。适用于高吞吐量的服务器应用。

  • CMS收集器:CMS(Concurrent Mark Sweep)收集器是一种并发的垃圾回收器,它使用标记-清除算法。它在应用程序运行期间和应用程序线程并发地进行垃圾回收。适用于对响应时间有较高要求的应用。

  • G1收集器:G1(Garbage First)收集器是一种面向服务器应用的垃圾回收器,它使用分代收集和标记-整理算法。它的特点是将堆内存划分为多个区域,每个区域可以作为年轻代或老年代,同时进行并发标记和并发整理。适用于大内存应用和低延迟要求的应用。

  • ZGC收集器:ZGC(Z Garbage Collector)收集器是Java 11引入的一种低延迟的垃圾回收器。它使用了柔性的内存布局和无停顿的垃圾回收算法,可以在几毫秒的时间内处理非常大的堆。适用于对延迟要求非常严格的应用。

  1. 标记-复制算法

    • 标记-复制算法是一种用于解决内存碎片问题的垃圾回收算法。它将堆内存分为两个区域:一个用于存活对象,另一个用于新创建的对象。垃圾回收器首先在存活对象的区域中进行标记,然后将存活对象复制到另一个区域,最后清除原区域中的所有对象。这样可以解决内存碎片问题,但是会产生内存浪费。

    • 优点:高效,不会产生内存碎片。

    • 缺点:会浪费一部分内存空间。

  2. 标记-清除算法

    • 标记-清除算法是一种较为简单的垃圾回收算法。它分为两个阶段:标记阶段和清除阶段。在标记阶段,垃圾回收器会标记所有活动对象;在清除阶段,垃圾回收器会清除所有未被标记的对象。这种算法会产生内存碎片,并且在清除阶段需要暂停应用程序。

    • 优点:简单,实现相对容易。

    • 缺点:会产生内存碎片,并且在清除阶段会暂停应用程序。

  3. 分代收集

    • 分代收集是一种优化垃圾回收效率的方法。根据对象的生命周期将堆内存划分为不同的代(Generation),通常分为年轻代(Young Generation)和老年代(Old Generation)。年轻代中的对象生命周期较短,老年代中的对象生命周期较长。垃圾回收器会根据各代对象的特性采用不同的垃圾回收算法和策略,如标记-复制算法用于年轻代,标记-清除算法用于老年代。

    • 优点:根据对象的生命周期采用不同的回收策略,提高了垃圾回收效率。

    • 缺点:需要维护多个代,增加了复杂性。

  4. 标记-整理算法

    • 标记-整理算法是一种用于解决内存碎片问题的垃圾回收算法。它首先标记所有活动对象,然后将活动对象向一端移动,然后清理掉不再使用的内存空间。这样可以使得内存空间连续,避免了内存碎片问题。

    • 优点:解决了内存碎片问题,不会浪费内存空间。

    • 缺点:需要移动对象,可能会导致一定的性能开销。

  5. 柔性的内存布局和无停顿的垃圾回收算法

    • 柔性的内存布局和无停顿的垃圾回收算法是一种针对低延迟应用的垃圾回收技术。它采用了一系列技术来减少垃圾回收造成的停顿时间,如并发标记、并发清除、并发整理等。这种算法通常用于需要快速响应时间的应用场景,如金融交易、实时游戏等。

    • 优点:减少了垃圾回收造成的停顿时间,提高了应用程序的响应速度。

    • 缺点:实现相对复杂,可能会增加系统的开销。

运行

.java --> 编译(Compilation) --(.class)--> 加载(Loading) -->连接(Linking) -->初始化(Initialization) -->执行(Execution) -->卸载(Unloading)

  • 编译(Compilation): 将源文件编译成字节码文件(.class)

  • 加载(Loading): JVM 将字节码文件(.class)解释或编译成特定平台的机器代码加载到内存

  • 连接(Linking):Java的链接过程与C++的链接不同。Java是在运行时进行链接的,称为动态链接。

    • 验证:已经在加载阶段提到,确保加载的类的二进制信息的正确性。

    • 准备:同样已经在加载阶段提到。

    • 解析:把类中的符号引用转换为直接引用。

  • 初始化(Initialization),Java虚拟机(JVM)会对类进行初始化,包括执行静态变量的赋值和静态代码块的初始化。

  • 执行(Execution) : Java虚拟机开始执行程序。

  • 卸载(Unloading):内存空间会被垃圾回收器回收,从而释放内存资源。

c++

.c --> 预处理(Pre-processor) --(.i)->编译(Compiler) -(.s)->汇编(Assmbler) --(.o)->连接(Liniker) -->.exe

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值