首先我们了解一下:JDK,JRE,JVM、IDE
- IDE = Integrated Development Environment = 集成开发环境
- JDK = Java development kit = 开发工具包
- JDK包含了JRE,JRE包含了JVM(是JRE的一部分)
- JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。
- JRE = Java runtime environment = 运行环境,也就是Java平台。所有的Java 程序都要在JRE下才能运行。
JVM = Java virtual machine = 虚拟机(用于执行bytecodes字节码的虚拟计算机)
- Java虚拟机是一种用于计算设备的规范,它是一个虚构出来的计算机,是利用软件方法在实际的计算机上仿真模拟各种计算机功能。
- JVM是java的核心和基础,在java编译器和OS平台之间的虚拟处理器。
- JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。【Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。这就是Java的能够“一次编译,到处运行”的原因。】
- JVM实例对应了一个独立运行的java程序它是进程级别
- Java有自己完善的硬件架构,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
由图可知
大多数 JVM 将内存区域划分为
1. Method Area(Non-Heap)(方法区)
2. Heap(堆)
3. Program Counter Register(程序计数器)
4. VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的)
5. Native Method Stack ( 本地方法栈 )
其中Method Area 和 Heap 是线程共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非线程共享的。
知识点检验
1.下面有关JVM内存,说法错误的是?
A. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
B. 虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔 离的
C. 方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的
D. 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的
2.对于JVM内存配置参数:-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3,其最小内存值和Survivor区总大小分别是()
A. 5120m,1024m
B. 5120m,2048m
C.10240m,1024m
D.10240m,2048m
3.根据下面的程序代码,哪些选项的值返回true?
public class Square {
long width;
public Square(long l) {
width = l;
}
public static void main(String arg[]) {
Square a, b, c;
a = new Square(42L);
b = new Square(42L);
c = b;
long s = 42L;
}
}
A. a == b、
B. s == a
C.b == c
D.a.equals(s)