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