当前位置: 首页 > news >正文

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

相关文章:

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

JDK 全称 Java SE Development Kit (Java 开发工具包) JVM虚拟机:Java运行的地方 核心类库:Java提前编好的东西 开发工具: javac,java,jdb,jhat javac:Java编译器,用于将Java源代码编译成Java字节码文件(.class)。 java: java…...

【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】

请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编读系统寄存器 ARMv8 C 内嵌汇编读系统寄存器 要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值,并将其返回,可以按照以下方式实现system_read_reg函数: #…...

使用 LlamaParse 进行 PDF 解析并创建知识图谱

此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性,适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…...

Oracle行迁移解析

行迁移(Row Migration)是Oracle数据库中的另一个现象,它与行链接类似,都是由于数据行大小的变化导致的存储问题,但其本质和影响有所不同。 触发条件:行迁移发生在当一个已存在的、原先能够完全存储在一个数…...

【k8s】 busybox镜像、挂载volume卷

1. 概述 busybox是一个包含了nslookup,ping,wget等网络处理命令的Pod容器(不含curl命令),它的体积非常小,适合做一些容器内的网络调试。 即创建一个docker ,进去执行 ping 命令等 2. 启动容器 2.1 会自动退出&…...

文本三剑客之 sed 编辑器

一.sed 概述 1.sed 介绍 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个 命令文本文件中。 2.sed 的工…...

【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并

主博客: 【MySQL精通之路】SQL优化(1)-CSDN博客 上一篇: 【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客 下一篇: 目录 1.索引合并-交集访问算法 2.索引合并联合访问算法 3.索引合并-排序联合访问算法 4.影响索引合…...

Linux中安装配置并使用samba服务(Centos以及Ubuntu)

目录 前言1. 基本知识2. Centos3. Ubuntu3.1 物理服务器3.2 云服务器前言 在window与linux系统中配置一个共享文件夹,可以做很多时间,比如映射器或者像linux中定时存放文件等 1. 基本知识 在Ubuntu上安装和配置Samba服务可以让你的Ubuntu机器与Windows、macOS以及其他Linu…...

three.js能实现啥效果?看过来,这里都是它的菜(06)

这是第五期了,本期继续分享three.js可以实现的3D动画案例,有老铁反馈再发案例的时候,是否可以顺道分享一下three.js的知识点,好吧,安排。 材质动画 材质动画可以实现各种复杂的视觉效果,包括但不限于以下…...

利用ESP32-C3将TF卡内容变成U盘进行读取

利用ESP32-C3将TF卡内容变成U盘进行读取 ESP32-C3是一款高性价比的微控制器,具备WiFi和蓝牙功能,广泛应用于物联网(IoT)项目中。除了常见的无线通信功能外,ESP32-C3还可以用来模拟U盘读取TF卡内容。本文将介绍如何通过…...

C++小病毒

C小病毒&#xff08;注&#xff1a;对电脑无过大伤害&#xff09; 短短行&#xff0c;创造奇迹&#xff01; 把这个文件命名为virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…...

使用VUE3+TS+elementplus创建一个增加按钮

一、前言 在上一篇文章中分享了创建table的过程&#xff0c;详见&#xff08;VUE3TSelementplus创建table&#xff0c;纯前端的table&#xff09;&#xff0c;本文在创建好的table的基础上&#xff0c;再创建一个增加按钮。 二、程序展示 1、前面创建table的程序 <templ…...

Python面试宝典:文件读写和上下文管理器以及输入输出流面试题(1000加python面试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第一部分:Python基础:第八章:文件操作和输入输出:第一节:文件读写和上下文管理器以及输入输出流】 第八章:文件操作和输入输出第一节:文件读写和上下文管理器以及输入输出流1.1、文件读写基本操作1.1.1、打开…...

Spring Boot | Spring Boot 实现 “记住我“ 功能

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 )二、实现 "记住我" 功能 ( 通过 "HttpSecurity类" 的 rememberMe( )方法来实现 "记住我" 功能 ) :2.1 基于 "简单加密 Token" 的方式 ( 实现 "记住我&…...

AGM AG32 MCU替代GD32F407/STM32F407的手持示波器方案

一、AG32 MCU替代GD32F407/STM32F407的数字示波器方案 市场上有多款数字迷你示波器&#xff0c;特别小巧&#xff0c;携带非常方便。单通道&#xff0c;标注100Mhz带宽&#xff0c;500MS采样率。 这样高的采样率需要使用高速AD及很高性能的处理器。原方案使用AD9288双通道8bit …...

MongoDB基础入门到深入(八)MongoDB整合SpringBoot、Chang Streams

文章目录 系列文章索引十五、MongoDB整合SpringBoot1、环境准备2、集合操作3、文档操作&#xff08;1&#xff09;相关注解&#xff08;2&#xff09;创建实体&#xff08;3&#xff09;添加文档&#xff08;4&#xff09;查询文档&#xff08;5&#xff09;更新文档&#xff0…...

linux下的nfs概述与实验(openEuler22.03)

目录 什么是NFSNFS工作原理NFS常用文件/etc/exports文件/etc/exports格式 /var/lib/nfs/etab文件 NFS常用选项NFS配置方式1. 安装NFS和RPC2. 启动rpcbind和nfs3. 准备目录4. 配置/etc/exports并重启服务5. 连接测试服务端自我测试客户端测试 补充常用命令永久挂载注意 什么是NF…...

影响Oracle数据库打开速度的因素

当Oracle发起一个事务需要更改数据时&#xff0c;如果所涉及的数据块不在BUFFER CACHE中&#xff0c;那么Oracle服务进程首先会将相关数据块从数据文件中读进BUFFER CACHE进行更改&#xff08;直接路径读除外&#xff09;&#xff0c;更改后的数据块称之为脏块&#xff08;DIRT…...

dify:开源 LLMOps平台。

单纯笔记&#xff1a; 一、关于 Dify dify/README_CN.md at main langgenius/dify GitHub Dify 是一款开源的大语言模型&#xff08;LLM&#xff09;应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以…...

CCF20220601——归一化处理

CCF20220601——归一化处理 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…...

别再只盯着Ra了!从轴承到晶圆,聊聊三维粗糙度Sa怎么测更准

从Ra到Sa&#xff1a;三维粗糙度测量的技术革命与实操指南 在精密制造领域&#xff0c;表面粗糙度测量正经历一场静默但深刻的范式转移。当半导体工艺迈入5纳米时代&#xff0c;当轴承寿命要求突破百万转大关&#xff0c;传统二维线扫描的Ra参数越来越难以捕捉微观形貌的全貌。…...

保姆级教程:在RK3588开发板上用Python部署NanoTrack,实测120FPS真香

保姆级教程&#xff1a;在RK3588开发板上用Python部署NanoTrack&#xff0c;实测120FPS真香 RK3588作为当前嵌入式AI领域的旗舰级芯片&#xff0c;其强大的NPU算力让边缘设备也能流畅运行复杂的视觉算法。本文将手把手带你完成NanoTrack模型从转换到部署的全流程&#xff0c;实…...

Jooby数据库集成实战:Hikari、JDBI、Ebean最佳实践

Jooby数据库集成实战&#xff1a;Hikari、JDBI、Ebean最佳实践 【免费下载链接】jooby The modular web framework for Java and Kotlin 项目地址: https://gitcode.com/gh_mirrors/jo/jooby Jooby是一个模块化的Java和Kotlin Web框架&#xff0c;提供了简洁高效的数据库…...

从文字问诊到具身交付:健康 Agent 产品落地实战

当健康 Agent 跳出冰冷文字框&#xff0c;升级为能开口、有表情、会互动的 3D 数字医生&#xff0c;产品体验会发生质变。本文完整记录&#xff1a;我如何用魔珐星云 SDK&#xff0c;把文字健康 Agent 落地为可交互数字员工的实战全过程。 一、产品痛点&#xff1a;健康 Agent&…...

AssetStudio深度解析:Unity资源提取原理与跨版本兼容实践

1. 这不是个“点开即用”的工具&#xff0c;而是一把需要校准的Unity资源解剖刀AssetStudio这个名字听起来像某个轻量级小工具&#xff0c;但实际用过的人很快会意识到&#xff1a;它根本不是拿来就跑的“一键提取器”&#xff0c;而是一套需要你亲手调参、理解Unity底层序列化…...

VHS Pro深度解析:Unity中模拟真实录像机信号链的原理与实践

1. 这不是“加个滤镜”那么简单&#xff1a;VHS Pro 的真实定位与行业缺口你打开 Unity Asset Store&#xff0c;搜“vhs”&#xff0c;会跳出二十多个插件。有的叫 VHS Effect&#xff0c;有的叫 Retro Tape&#xff0c;还有的直接叫 “80s Glitch”。点开预览图&#xff0c;全…...

创业团队如何利用Taotoken统一管理多个AI模型API以控制开发成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业团队如何利用Taotoken统一管理多个AI模型API以控制开发成本 对于资源有限的创业团队而言&#xff0c;在业务开发中引入大模型能…...

谷歌收录怎么做比较快?提升网页打开速度至2秒内的优化方案

谷歌爬虫&#xff08;Googlebot&#xff09;在网站停留的时间存在硬性额度。网页文件若达到 6MB&#xff0c;传输会耗尽爬虫配额。调整网页体积到 1MB 以内&#xff0c;同等时间内抓取数量能提升 4倍。每日抓取页面从 1000 个爬升到 4000 个&#xff0c;新内容进入索引库的时间…...

实测在ubuntu环境下调用taotoken api的延迟与稳定性表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 实测在ubuntu环境下调用taotoken api的延迟与稳定性表现 本文旨在分享在Ubuntu 22.04 LTS系统环境下&#xff0c;使用Python脚本持…...

鸿蒙生鲜电商页面构建:商品网格与配送档期模块详解

鸿蒙生鲜电商页面构建&#xff1a;商品网格与配送档期模块详解 前言 在 HarmonyOS 6.0 应用开发中&#xff0c;生鲜电商页面的商品展示和配送服务是两个直接影响转化率的核心模块。本文将以“鲜选菜篮”应用中的“精选货架”商品网格和“配送档期”时间选择模块为例&#xff0c…...