java虚拟机:简称JVM,是运行所有java程序的假想计算机,是java程序的运行环境,是java最具吸引力的特性之一,我们编写的java代码,都运行在JVM之上
跨平台:任何软件的运行,都必须要运行在操作系统之上,而我们用java编写的软件可以运行在任何的操作系统上,这个特性称为java语言的跨平台性。该特性是由JVM实现的,我们编写的程序运行在JVM上,而JVM运行在操作系统上。
如图所示java的虚拟机本身不具备跨平台功能的,每个操作系统下都有不同版本的虚拟机
虚拟机说直白一点就是:把.class文件翻译成计算机所能识别的语言,每个系统都有一台虚拟机。
.java文件通过javac编译成.class文件,即字节码,每个平台都有各自的虚拟机,然后通过虚拟机把字节码翻译成计算机所能识别的语言去执行
GC(垃圾回收)
所有线程共享的区域:Java堆、方法区
线程私有的:程序计数器、Java虚拟机栈、
与对象内存分配关系最密切的内存区域是:堆内存、栈内存(虚拟机栈)
虚拟机中内存最大的一块:java堆
Java堆是垃圾收集管理器的主要区域,因此也被称作“GC堆“
1.堆。 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xms -Xmx进行内存控制。
2.方法区。它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
3.虚拟机栈。虚拟机栈中执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
4.本地方法栈。与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
5.程序计数器。指示Java虚拟机下一条需要执行的字节码指令。
以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。