Java性能优化之JVM内存模型

[TOC]java


JVM内存模型

首先介绍下Java程序具体执行的过程:数组

  • Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀);
  • 由JVM中的类加载器加载各个类的字节码文件,加载完毕以后,交由JVM执行引擎执行
  • 在整个程序执行过程当中,JVM会用==一段空间==来存储程序执行期间须要用到的数据和相关信息,这段空间通常被称做为==Runtime Data Area(运行时数据区)==,也就是咱们常说的JVM内存;
  • 所以,在Java中咱们经常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)

JVM的内存划分和各区域职责

image

  • 程序计数器:程序计数器是指CPU中的寄存器,它保存的是==程序当前执行的指令的地址==(也能够说保存下一条指令的所在存储单元的地址),当CPU须要执行指令时,须要从程序计数器中获得当前须要执行的指令所在存储单元的地址,而后根据获得的地址获取到指令,在获得指令以后,程序计数器便自动加1或者根据转移指针获得下一条指令的地址,如此循环,直至执行完全部的指令;多线程

    注:JVM中的程序计数器并不像汇编语言中的程序计数器同样是物理概念上的CPU寄存器,可是逻辑做用上是等同的,在JVM中多线程是经过线程轮流切换来得到CPU执行时间的,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,为了可以使得每一个线程都在线程切换后可以恢复在切换以前的程序执行位置,每一个线程都须要有本身独立的程序计数器,而且不能互相被干扰,不然就会影响到程序的正常执行次序。==所以,能够这么说,程序计数器是每一个线程所私有的==
  • Java栈:Java栈是Java方法执行的内存模型,Java栈中存放的是一个个的栈帧,每一个栈帧(包括:局部变量表、操做数栈、运行时常量池(在下文中提到的方法区内)的引用、方法返回地址和一些额外的附加信息)对应一个被调用的方法,当线程执行一个方法时,就会随之建立一个对应的栈帧,并将创建的栈帧压栈。当方法执行完毕以后,便会将栈帧出栈;spa

    注:因为每一个线程正在执行的方法可能不一样,所以每一个线程都会有一个本身的Java栈,互不干扰
  • 本地方法栈:Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的;
  • :Java中的堆是用来存储对象自己的以及数组;
  • 方法区:它与堆同样,是被线程共享的区域,存储了每一个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。线程

    注:在方法区中有一个很是重要的部分就是运行时常量池,它是每个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被建立出来。固然并不是Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,好比String的intern方法。
相关文章
相关标签/搜索