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

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

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.mrgr.cn/news/82775.html

相关文章:

  • 06-RabbitMQ基础
  • Airflow:SQL Sensor 监控数据库业务变化
  • Docker入门篇[SpringBoot之Docker实战系列] - 第534篇
  • 【网络云SRE运维开发】2025第2周-每日【2025/01/06】小测-【第6章 VLAN技术原理与配置】理论和实操
  • AI 将在今年获得“永久记忆”,2028美国会耗尽能源储备
  • jenkins入门3 --执行一个小demo
  • MyBatis学习笔记-数据加密解密
  • github gitbook写书
  • vue项目上传ofd文件,导致文件类型丢失问题
  • 【C#】C# 使用onnxruntime报错记录
  • 51单片机——步进电机模块
  • 【AI落地】AI生成测试用例,claude or gpt?(提效至少 50%)
  • Linux: 关于 mount 的一些细节
  • STM32 I2C通信外设
  • FreeSWITCH 呼出之我见
  • java常见面试题
  • [备忘.OFD]OFD是什么、OFD与PDF格式文件的互转换
  • 起重机检测数据集VOC+YOLO格式2316张1类别
  • Spring 复习笔记
  • Vue笔记-001-声明式渲染
  • 【简博士统计学习方法】3. 统计学习方法的三要素
  • 自定义字典转换器用于easyExcel 导入导出
  • 51单片机(二)中断系统与外部中断实验
  • INT305 Machine Learning
  • Linux 35.6 + JetPack v5.1.4之 pytorch升级
  • 【LC】2469. 温度转换