java虚拟机1-JVM内存区域划分详解

JVM内存区域划分详解

java的跨平台

java 语言是一种跨平台的编程语言,是因为JAVA 其实是运行在JAVA虚拟机(JVM)上,然后由JVM解析执行。不同的平台JVM 不同 ,但是运行的却是相同的java程序。所以实现了跨平台 “一次编译,到处执行”。

JAVA程序运行在JVM上,JVM是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为class的类文件,class文件可 以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解 释给本地系统执行。

下面我们来详细学习JVM。

JVM内存区域

堆栈

java内存区域简单来说就是“堆栈”,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行java程序的。但是 堆内存和栈内存的这种划分方式比较粗糙,java的内存划分实际上远比这复杂。一个好的Java程序员不应该只了解堆栈的简单概念,而是应该去了解虚拟机的内存区域以及会引起内存泄露和内存溢出的场景等。

JVM运行时数据区

java 程序(.java 文件)先通过编译器编译成class文件(.class)。然后class文件通过类加载器(CLASS LOADER)加载到JVM 内存区域。详细过程如下图 。
JVM内存区域

jvm 在其内部定义了内存区域 ,主要包括 HEAP(堆),METHOD AREA(方法区),JAVA STACK(虚拟机栈),NATIVE METHOD STACK(本地方法栈),PROGRAM COUNTER REGISTER(程序计数器)。这些内存区域的生命周期不同。其中图中绿色的部分是所有线程共享的内存区域,它随着虚拟机的启动和结束而建立和销毁,白色区域则是每一个用户线程独有的。它随每个用户线程启动和结束而建立和销毁。下面我们来一一说明每个内存区域的作用。

所有线程共享的内存区域

1 堆(HEAP)
java 堆是JVM内存区域中最大的一块,它被所有线程所公用。它随着JVM的启用而创建,它主要是用来存放java程序中所产生的对象实例。在java中我们不需要手动的去分配和释放内存。内存的分配是由程序完成的,我们通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。而释放内存是通过GC(垃圾收集器)管理释放的。堆还可以细分为新生代和老年代新生代再细致一点还可以分为Eden区、From Survivior区、To Survivor区。 如果堆内存不足就可能导致堆内存溢出 java.lang.OutOfMemoryError

2 方法区(METHOD AREA)
方法区用于存储虚拟机加载的类信息、常量、静态变量(JDK7中被移到Java堆),即时编译期编译后的代码(类方法)等数据等数据,虚拟机规范是把这块区域描述为堆的一个逻辑部分的,但实际它应该是要和堆区分开的。这里需要说一下运行时常量池它是方法区的一部分,用于存放编译期生成的各种字面量和符号引用(其实就是八大基本类型的包装类型和String类型数据(JDK7中被移到Java堆))
jdk7已经把原本放在方法区的字符串常量池(注意名字是字符串常量池不是运行时常量池)移出。

每个线程独有的内存区域

1 程序计数器(PROGRAM COUNTER REGISTER)
每一个线程都拥有一个自己独有的程序计数器。它是当前线程所执行的字节码的行号指示器,注意是正在执行的字节码地址,而不是下一条。
2 虚拟机栈(JAVA STACK)
 每一个线程都拥有一个自己独有的虚拟机栈,虚拟机栈描述的是Java方法执行的内存模型:每个方法执行的时候都会创建一个栈帧,用于存放局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直到执行完成的过程都对应着一个栈帧在虚拟机中的入栈到出栈的过程。如果程序方法递归调用深度太深就可能导致java.lang.StackOverflowError。
3 本地方法栈(NATIVE METHOD STACK)

本地方法栈虚和拟机栈起的作用一样,区别是本地方法栈为虚拟机使用到的Native方法服务。在HotSpot虚拟机它和虚拟机栈是一起的。

以上就是jvm 内存区域的划分。总结如下图。
这里写图片描述

注意:

  1. 堆中储存的是:主要是用来存放java程序中所产生的对象实例。
  2. 方法区储存的是:用于存储虚拟机加载的类信息、常量、静态变量(JDK7中被移到Java堆),即时编译期编译后的代码(类方法)等数据。
  3. 虚拟机栈储存的是:存放局部变量表,操作数栈,动态链接,方法出口等信息。

学习了jvm的内存分区,后面将会学习JVM 内存溢出的各种情况,垃圾回收算法,以及类加载过程等

猜你喜欢

转载自blog.csdn.net/hubin916/article/details/80194074