JDK、JRE、JVM三者的关系、JDK8的新特性、JVM内存结构,堆栈的区别

news2025/1/8 19:12:54

1.JDK、JRE、JVM三者的关系

JDK (Java Development Kit)----Java开发工具包,用于Java程序的开发。

JRE (Java Runtime Environment)----Java运行时环境,只能运行.class文件,不能编译。

JVM (Java Virtual Machine)----Java虚拟机,Java运行时环境。

关系:JDK包含JRE  ,JRE包含JVM

  • 如果我们开发Java程序就需要JDK,因为要编译Java源文件
  • 如果我们只想运行已经编译好的Java字节码文件,也就是 *.class 文件,那么就只需要JRE
  • JVM在执行Java字节码文件时,需要把字节码解释为机器指令,而不同的操作系统的机器指令是有可能不一样的,所以就导致不同的操作系统上的JVM是不一样的,所以我们在安装JDK时需要选择操作系统。
  • JVM是用来执行Java字节码文件的,所以凡是某个代码编译之后的是Java字节码文件,那就能在JVM上运行,比如Apache Groovy,Scala and Kotiln等等。 

那么JRE和JVM都是运行字节码文件的,他们的区别是什么?

  • JVM是JRE的一个组成部分,专门用于执行java字节码
  • JRE提供了运行任何java应用程序所需的一切,而不仅仅只是用来执行代码。JRE提供了一套完整的库和其他资源,使得java程序可以在任何支持java的平台上运行。

原文链接:https://blog.csdn.net/qq_45004609/article/details/128165415

2.JDK8的新特性

Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。下面是JDK8中引入的几个主要的新特性:

  • Lambda 表达式 − 提供了一种简洁的方式来表示函数式接口🔍(只有一个抽象方法),简化了代码。

  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

  • 默认方法和静态方法− 有助于向后兼容,可以在不修改实现类的情况下给接口添加新功能。

  • 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

  • Stream API 一种用于处理集合的强大工具,允许开发者以声明性的方式处理数据集合,如过滤、映射、减少操作等。可以顺序和并发执行,提高处理大数据的效率。

  • Date Time API − 加强对日期与时间的处理。提高了不可变的时间对象,支持线程安全。

  • Optional 类 − 用来解决空指针异常。

  • Nashorn, JavaScript 引擎 − 它允许我们在JVM上运行特定的javascript应用。

  • 重复注解和类型注解-允许同一类型的多个注解应用与同一个声明或类型使用。类型注解扩展了注解的使用范围,比如泛型参数、变量声明、方法返回类型等。

3.JVM内存结构,堆栈的区别

JVM内存结构:

JVM的内存结构大概分为:

  • 堆(Heap):线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。
  • 方法区(Method Area):线程共享。存储类信息、常量、静态变量、即时编译器编译后的代码。
  • 方法栈(JVM Stack):线程私有。存储局部变量表、操作栈、动态链接、方法出口,对象指针。
  • 本地方法栈(Native Method Stack):线程私有。为虚拟机使用到的Native 方法服务。如Java使用c或者c++编写的接口服务时,代码在此区运行。
  • 程序计数器(Program Counter Register):线程私有。有些文章也翻译成PC寄存器(PC Register),同一个东西。它可以看作是当前线程所执行的字节码的行号指示器。指向下一条要执行的指令。

堆栈的区别: 

JVM中的堆(Heap)和栈(Stack)是两个重要的内存区域,具有不同的特点和用途。下面是它们之间的区别:

  1. 存储内容:
    • 堆:堆用于存储对象实例和数组等动态分配的内存。在堆中分配的对象可以被多个线程访问。
    • 栈:栈用于存储方法调用、局部变量和方法参数等。每个线程都有自己的栈帧,用于存储方法的执行环境和局部数据信息。
  1. 分配方式:
    • 堆:采用动态分配的方式进行内存分配,可以通过new关键字在堆中创建对象或数组。
    • 栈:采用静态分配的方式进行内存分配,随着方法的进入和出栈,栈帧的分配和释放也相应发生。
  1. 内存管理:
    • 堆:堆的内存管理由垃圾回收器负责,自动回收不再使用的对象,释放内存。
    • 栈:栈的内存管理由编译器自动管理,方法退出时,栈帧自动弹出,释放相关资源。
  1. 内存分配效率:
    • 堆:堆的内存分配相对较慢,因为需要进行垃圾回收和内存整理。
    • 栈:栈的内存分配相对较快,只需简单地移动指针即可。
  1. 大小限制:
    • 堆:堆的大小可以通过JVM参数进行调整,一般比较大,不受具体线程个数的限制。
    • 栈:栈的大小是有限的,并且在编译时确定,每个线程都有自己的独立栈空间。
  1. 存储对象生命周期:
    • 堆:在堆中分配的对象的生命周期可以跨越多个方法和线程,直到垃圾回收器将其回收
    • 栈:栈中的对象生命周期与方法的调用关系密切相关,当方法调用结束时,栈帧中的局部变量就会被销毁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】文件的压缩与解压

目录 gzip和 gunzip bzip2 和 bunzip2(特点和gzip相似) xz和unxz(特点和gzip相似) zip 和 unzip tar gzip和 gunzip 特点:只能对单个的普通文件进行压缩 不能进行归档,压缩或解压后的源文件都不存在 压缩后所生成的压缩格式是.gz格式 压缩&…

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

VSCode 使用鼠标滚轮控制字体

一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意:保存哦!ctrlS 三、测试 按住ctrl鼠标滚轮,控制字体大小

enzymejest TDD与BDD开发实战

一、前端自动化测试需要测什么 1. 函数的执行逻辑,对于给定的输入,输出是否符合预期。 2. 用户行为的响应逻辑。 - 对于单元测试而言,测试粒度较细,需要测试内部状态的变更与相应函数是否成功被调用。 - 对于集成测试而言&a…

TCP通信原理学习

TCP三次握手和四次挥手以及为什么_哔哩哔哩_bilibili

空间不足导致Oracle集群内存使用率暴增

一、现象 操作系统内存使用率告警,已达到98%,,告警内容如下: 【全景监控:Oracle主机内存使用监控】 【主机名】:XXXXX11 【主机IP】主机IP:*.126.15 【告警内容】当前内存使用率为98.9%,超警…

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…

【JMM】Java 内存模型

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前言2. JMM 内存模型内容3. JMM 内存模型简单执行示意图 ⚠️ 不要与 JVM 内存分布混为一谈论&#xff0c…

SEO新革命:如何通过Search Everywhere优化全面打破搜索壁垒

谷歌不再总是人们寻求答案的首选之地。他们越来越多地转向社交媒体、YouTube、亚马逊和 ChatGPT。这些平台本身已经成为搜索引擎。 因此,SEO 需要发展。仅靠搜索 “引擎” 优化已经不够了。品牌需要优化其在每个平台上的自然存在。 您需要一种新型的 SEO&#xff…

Spring 设计模式:经典设计模式

Spring 设计模式:经典设计模式 引言 Spring 框架广泛使用了经典设计模式。 这些模式在 Spring 内部发挥着重要作用。 通过理解这些设计模式在 Spring 中的应用,开发者可以更深入地掌握 Spring 框架的设计哲学和实现细节。 经典设计模式 控制反转&am…

“AI 视频图像识别系统,开启智能新视界

咱老百姓现在的生活啊,那是越来越离不开高科技了,就说这 AI 视频图像识别系统,听起来挺高大上,实际上已经悄无声息地融入到咱们日常的方方面面,给咱带来了超多便利。 先讲讲安防领域吧,这可是 AI 图像识别的…

开源AI智能名片2+1链动模式S2B2C商城小程序在商业流量获取中的应用研究

摘要: 随着互联网技术的迅猛发展,商业流量的获取已成为企业市场竞争中的关键环节。传统意义上的“客流量”在互联网语境下被赋予了新的内涵,即“商业流量”,其本质依然指向用户。在当前线上线下融合的商业环境中,流量…

【蓝桥杯研究生组】第14届Java试题答案整理

试题链接&#xff1a;链接 A题 满足条件的答案有&#xff1a;35813116 public class TianShu {public static void main(String[] args) {int ans 0;// 2000.1.1 - 2000000.1.1// 年份是月份的倍数&#xff0c;也是日的倍数for (int year2000; year<2000000; year) {for …

c/c++ 里的进程间通信 , 管道 pipe 编程举例

&#xff08;1&#xff09;以下是一个网上的使用 pipe 编程的范例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h>int main() {int pipefd…

RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

RK3588FPGA核心板采用Rockchip RK3588新一代旗舰 级八核64位处理器&#xff0c;支持8K视频编解码&#xff0c;多屏4K输出&#xff0c;可实现12屏联屏拼接、同显、异显&#xff0c;适配多种操作系统&#xff0c;广泛适用于展览展示、广告内容投放、新零售、商超等领域实现各种媒…

uniapp使用chooseLocation安卓篇

本文章全部以高德地图为例 代码 <view class"bottom"><button click"choose">定位</button> </view> choose() {uni.chooseLocation({success: function(res) {console.log(位置名称&#xff1a; res.name);console.log(详细地…

flutter 专题三十三 Flutter 重构去哪儿QTalk

QTalk 是去哪儿网内部的一个 IM 沟通工具&#xff0c;同时集成了很多内部的系统&#xff0c;比如 OA 审批&#xff0c;门禁打卡&#xff0c;请假审批&#xff0c;预定会议室&#xff0c;驼圈&#xff08;驼厂朋友圈&#xff09;等功能&#xff1b;方便内部办公沟通、交流的同时…

任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构 由上一篇的Quartz基本使用可以发现&#xff0c;Quartz 主要包含一下几种角色&#xff1a; 1&#xff09;Job&#xff1a;也可以认为是JobDtetail&#xff0c;表示具体的调度任务 2&#xff09;Trigger&#xff1a;触发器&#xff0c;用于定义任务Job出发执行…

141.环形链表 142.环形链表II

141.环形链表 & 142.环形链表II 141.环形链表 思路&#xff1a;快慢指针 or 哈希表 快慢指针代码&#xff1a; class Solution { public:bool hasCycle(ListNode *head) {if(headnullptr||head->nextnullptr)return false;ListNode *fasthead->next; //不能设置成…

软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)

软件系统实施标准化流程设计至关重要&#xff0c;因为它能确保开发、测试、部署及维护等各阶段高效有序进行。标准化流程能减少人为错误&#xff0c;提升代码质量和系统稳定性。同时&#xff0c;它促进了团队成员间的沟通与协作&#xff0c;确保项目按时交付。此外&#xff0c;…