Jvm简介及内存区域

1 Java从编译到执行

一个 Java 程序,首先经过 javac 编译成 .class 文件,然后 JVM 将其加载到方法区,执行引擎将会执行这些字节码。执行时,会翻译成操作系统相关的函数。JVM 作为 .class 文件的翻译存在,输入字节码,调用操作系统函数。
Jvm简介及内存区域

2 JVM的跨平台与语言无关性

(1) JVM的跨平台
Java官方提供了各个平台32bit和64bit的机器的不同版本的JDK,所以在各个平台下都会有相应的JVM。站在JVM的角度,JVM只解释执行字节码文件,所以我们的Java代码会统一会编译成字节码文件,这样就可以在各个平台上运行了。
简而言之,也就是Java官方从包揽了各个平台下JVM的开发工作,程序员不需要考虑平台各自的接口和特性,只需要提供编译后的class字节码文件,这样就可以一处编译处处运行,达到平台无关性(Write Once ,Run Anywhere)。

(2) JVM的语言无关性
JVM只解释执行字节码文件,所以无论语言是什么样,只要最终可以编译成字节码文件,这样的代码就可以在JVM上运行。
截至目前,商业机构和开源机构已经在Java语言之外发展出一大批可以在JVM上运行的语言了,如Groovy、Scala、Jython等。之所以可以支持,就是因为这些语言也可以被编译成字节码(.class文件),而虚拟机并不关心字节码是有哪种语言编译而来的。
Jvm简介及内存区域

3 JVM的内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
Jvm简介及内存区域

3.1 虚拟机栈

(1) 存储当前线程运行java方法所需的数据,指令、返回地址。大小限制 –Xss
Jvm简介及内存区域
(2) 栈帧
栈帧:在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦方法完成相应的调用,则出栈。
栈帧大体都包含四个区域:(局部变量表、操作数栈、动态连接、返回地址),大小限制 -Xss。
局部变量表:顾名思义就是局部变量的表,用于存放我们的局部变量的(方法中的变量)。主要存放我们的 Java 的八大基础数据类型,如果是局部的一些对象,比如我们的 Object 对象,我们只需要存放它的一个引用地址即可。
操作数据栈:存放 java 方法执行的操作数的,它就是一个栈,先进后出的栈结构,操作数栈,就是用来操作的,操作的的元素可以是任意的 java 数据类型,所以我们知道一个方法刚刚开始的时候,这个方法的操作数栈就是空的。
动态连接:Java 语言特性多态。
返回地址:调用程序计数器中的地址作为返回
Jvm简介及内存区域

3.2 方法区

方法区主要是用来存放已被虚拟机加载的类相关信息,包括类信息、静态变量、常量、运行时常量池、字符串常量池等。JVM 在执行某个类的时候,必须先加载。在加载类(加载、验证、准备、解析、初始化)的时候,JVM 会先加载 class 文件,而在 class 文件中除了有类的版本、字段、方法和接口等描述信息外,还有一项信息是常量池 (Constant Pool Table),用于存放编译期间生成的各种字面量和符号引用。

3.3 堆

堆是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆

相关参数:
-Xms:堆的最小值;
-Xmx:堆的最大值;
-Xmn:新生代的大小;
-XX:NewSize;新生代最小值;
-XX:MaxNewSize:新生代最大值;

匿名

发表评论

匿名网友