jvm的内存结构

Posted nyhhd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm的内存结构相关的知识,希望对你有一定的参考价值。

一.java程序的具体执行过程:
  1.java源文件会被java编译器编译成字节码文件
  2.然后由jvm中的类加载器加载各个类的字节码文件
  3.加载完后,由jvm的执行引擎执行
  备注:在执行的过程中jvm一段空间来存储数据:运行时数据区,也称jvm内存

二.根据jvm规范,jvm把内存划分为了如下几个区域:
  1.程序计数器:也称pc寄存器,用来指示执行哪条命令的,
    每个线程都有一个,为了不影响程序的正常执行顺序。
  2.java栈:存放的是一个个的栈帧,每个栈帧都对应一个方法,栈帧中包括如下:
    1)局部变量表:存放基础数据类型的值,引用类型对象的引用
    2)操作数栈:程序中的所有计算过程都是在借助于操作数栈来完成的。
    3)运行时常量池的引用:指向运行时类中的常量
    4)方法返回地址:返回调用方法的地址
    注:栈的垃圾回收是由系统自动分配的,每个栈对应一个线程,也就是说每个线程都有自己的栈
  3.本地方法栈
    执行原理与java栈相似,只是它为执行本地方法服务.
  4.堆区
    存放对象的本身以及数组,堆被所有线程共享,在jvm中只有一个堆
  5.方法区,常称为永久代,因为执行GC的情况很少,其上的gc主要针对常量池的回收和已加载类的卸载.
    1)运行时常量池:在类和接口被加载到JVM后,对应的运行时常量池就被创建出来,
      当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中
    2)静态域:存放在对象中用static定义的静态成员
    注:
      1)方法区中存取了每个类的信息,静态变量,常量以及编译器编译后的代码
      2)String常量也是存放在常量池中的.class文件中的一些数据.
      3)常量池是指在编译器被确定,并保存在已编译的
      4)方法区是全局共享的,

注释:java的内存分配细分:
1)寄存器:我们在程序中无法控制
2)栈:存放基本数据类型和对象的引用
3)堆:存放用new产生的数据
4)静态域:存放在对象中用static定义的静态成员
5)常量池:存放常量
6)非RAM(:随机存取存储器,也称为主存,
与cpu直接交互数据大的内部存储器)存储:硬盘等永久存储空间

注:从java5.0开始,java虚拟机在启动时会实例化9个对象池.这九个对象池分别存储8种基本数据类型的包装类和String对象
当在程序中直接用双引号给字符串对象时,jvm就到String的对象池中检查是否有一个值相同的对象,如果有返回现有对象的引用
如果没有,则在对象池中创建,如果是new一个对象,则是直接在对象池中创建,没有上述操作
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");

str1 == str2 true;
str2 == str3 false;

以上是关于jvm的内存结构的主要内容,如果未能解决你的问题,请参考以下文章

你真的懂JVM内存结构吗?—深入理解JVM之内存结构

详解Jvm内存结构

详解Jvm内存结构

详解Jvm内存结构

JVM-jvm的内存结构和内存模型

JVM内存结构