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

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。
  • JDK中包含了JRE,JRE中包含了JVM。
  • JVM在执行Java字节码文件时,需要把字节码解释为机器指令,而不同的操作系统的机器指令是有可能不一样的,所以就导致不同的操作系统上的JVM是不一样的,所以我们在安装JDK时需要选择操作系统。
  • JVM是用来执行Java字节码文件的,所以凡是某个代码编译之后的是Java字节码文件,那就能在JVM上运行,比如Apache Groovy,Scala and Kotiln等等。 

原文链接: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 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。

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

  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。

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

  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

  • Date Time API − 加强对日期与时间的处理。

  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的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.kler.cn/a/465441.html

相关文章:

  • 计算机网络原理(谢希仁第八版)第4章课后习题答案
  • 数据去重与重复数据的高效处理策略
  • 9.系统学习-卷积神经网络
  • QML自定义进度条和单选按钮的样式
  • 人工智能之机器学习算法
  • Git快速入门(三)·远程仓库GitHub以及Gitee的使用
  • flutter 专题二十六 Flutter 新一代图形渲染器 Impeller
  • uniapp 多环境打包
  • unity团结云下载项目
  • 反向传播算法的偏置更新步骤
  • Windows系统下载、部署Node.js与npm环境的方法
  • CDP集群安全指南-动态数据加密
  • 咖啡馆系统|Java|SSM|JSP|
  • df.groupby([pd.Grouper(freq=‘1M‘, key=‘Date‘), ‘Buyer‘]).sum()
  • Java 应用程序CPU 100%问题排查优化实战
  • Git 树形图表不显示问题
  • 大数据职业技能资源分享
  • 设计模式 结构型 代理模式(Proxy Pattern)与 常见技术框架应用 解析
  • GROUP BY 的目的是将数据按照指定的列进行分组,然后对每个分组进行聚合计算,分组后,每个分组只会返回一行结果。
  • Python 3 与 Python 2 的主要区别
  • 微服务之服务治理——Eureka
  • python-leetcode-买卖股票的最佳时机 II
  • 基于XGBoost算法的集成学习
  • linux网络管理
  • 特征值描述了系统的固有频率平方,而特征向量描述了系统的振动模式
  • throw与noexcept对比