JVM学习笔记

JVM学习笔记

前言

在JVM学习文档查询的时候发现了,之前自己对于JVM的理解是不对的,自己没有将JVM的内存模型内存区域进行明确的区分。

JVM内存模型(JMM)

什么是JVM内存模型:JVM内存模型决定了一个线程对共享变量何时进行写入和何时对另一个线程可见。从抽象的角度上看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,同时每个线程又有一个私有的内存,还存在一个本地内存用来进行存储当前正在操作的现场用来读/写共享的变量副本(有多少线程就存在多少本地内存),线程通过这一操作进行主内存中变量进行操作。总的来说JVM内存模型的主要目的是定义了各个变量的访问规则,即在虚拟机中将变量存储到内存中和从内存中取出变量的底层的细节。
JMM

参考文档:什么是JMM

Java内存区域(运行时数据区)

Java的内存区域指的是运行时各个值进行存储的区域,Java虚拟机在执行Java程序的过程中会将不同类型的数据存放在不同的区域进行管理。一共有6个运行时数据区,他们分别是:程序计数器(The pc Register)、Java虚拟栈(Java Virtual Machine Stacks)、堆(Heap)、方法区(Method Area)、运行常量池(Run-Time Constant Pool)和本地方法栈(Native Method Stacks)。

运行时数据区:Java虚拟机定义了许多在程序运行时被用到的运行时数据区。其中的一些数据区在Java虚拟机启动的时候被创建,并且在Java虚拟机退出的时候被销毁。其他的数据区是属于单个线程的(线程私有)。线程私有的数据区在线程创建的时候被创建,并且在线程退出的时候被销毁。

其中运行常量池是在JVM的方法区中进行分配的。
java内存区域

程序计数器

Java虚拟机能支持多个线程同时执行。每个Java虚拟机线程有自己的pc(程序计数器)寄存器。在任何时候,每个Java虚拟机线程都在执行单个方法的代码,也就是该线程当前的方法。如果那个方法不是native方法,程序计数器包含Java虚拟机当前正在执行的指令地址。如果被这个线程执行的当前方法是native方法,Java虚拟机程序计数器的值是undefined。Java虚拟机程序计数器的宽度能容纳一个返回地址或者一个特定平台上的本地指针。

主要的作用:当前线程所执行的字节码的行号指示器。

Java虚拟栈

每个Java虚拟机线程都有一个和线程同时创建的私有Java虚拟机栈。一个Java虚拟机栈保存多个栈帧。一个Java虚拟机栈和常规的语言(如C)中的情况类似:它包含本地变量和部分结果,并且在方法调用和返回中起作用。由于Java虚拟机栈除了将栈帧入栈和出栈之外没有被直接操作的情况,栈帧可能被分配在堆中。Java虚拟机栈的内存不必是连续的。

每个方法在被执行时会创建一个栈帧用于存储局部变量表、操作数表、动态链表、方法出口等信息,例如:我们开始执行main方法时,就会为main方法创建一个栈帧,这个栈帧主要是用来存放main方法的局部变量,引用对象等,然后存入到Java虚拟栈中,在执行main方法的时候执行了一个方法other,这时就会为other方法创建一个属于他的栈帧,然后就执行other方法执行完毕后other的栈帧就会出栈然后继续执行main方法,等main方法执行完毕后,main方法的栈帧也会出栈,也标志着方法执行完毕。

Java虚拟机有一个在所有Java虚拟机线程之间共享的堆。堆是运行时数据区,从中分配所有类实例(对象)和数组的内存。

堆是在虚拟机启动时创建的。堆存储的对象被一个自动存储管理系统(称为垃圾收集器)回收;对象永远不会显式释放。堆的大小可以是固定的,也可以根据计算的需要进行扩展,如果不需要更大的堆,则可以将其收缩。堆的内存不必是连续的。

是一个线程共享的区域,会出现线程安全问题。所有的对象实力以及数组都要在堆上进行内存的分配。当我们new一个对象的时候,就会在堆中开辟一个内存区域进行存储。

方法区

Java虚拟机具有一个在所有Java虚拟机线程之间共享的方法区。方法区是在虚拟机启动时创建的。它存储每个类的结构,例如运行时常量池(前面提到的,运行常量池是方法区分配的),字段和方法数据,以及方法和构造函数的代码,包括用于类和实例初始化以及接口初始化的特殊方法。

方法区主要是存储已经被虚拟机加载类的信息、常量、静态变量和编译器编译后的代码(.class文件)等数据。

本地方法栈

Java虚拟机的实现可以使用一种传统的栈(俗称“C stacks”)来支持native方法(用Java编程语言以外的语言编写的方法)。

参考文档:JVM内存模型(JMM)和内存区域,别再傻傻分不清楚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值