首页 > 系统相关 >JMM内存模型 / JVM 内存区域

JMM内存模型 / JVM 内存区域

时间:2022-12-07 18:37:36浏览次数:35  
标签:Java 对象 虚拟机 线程 内存 JVM JMM


1. JMM

JVM定义了不同运行时数据区,他们是用来执行应用程序的。某些区域随着JVM启动及销毁,另外一些区域的数据是线程性独立的,随着线程创建和销毁。

Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。

JMM模型解决的问题:1、多线程读同步与可见性;2、多线程写同步与原子性

一. 线程共享区:
方法区:存放被虚拟机加载的类的元数据信息,如常量、静态变量和即时编译器编译后的代码。若要分代,算是永久代
堆:放对象实例和数组,是垃圾回收的主要区域,分为新生代和老年代

二. 线程私有区:
虚拟机栈:栈管理JAVA方法执行的内存模型。每个方法执行时都会创建一个桢栈来存储方法的的变量表、操作数栈、动态链接方法、返回值、返回地址等信息
本地方法栈:主要为 Native 方法(C语言)服务
程序计数器:记录当前线程执行的行号

JMM内存模型 / JVM 内存区域_Java

JMM内存模型 / JVM 内存区域_JVM_02

JMM内存模型 / JVM 内存区域_Java_03

JMM内存模型 / JVM 内存区域_JVM_04

2. 堆里面的分区: Eden, survival ( from+ to),老年代,各自的特点

堆里面分为新生代和老生代( java8 取消了永久代,采用了 Metaspace),新生代包含Eden+Survivor 区, survivor 区里面分为 from 和 to 区,内存回收时,如果用的是复制算法,从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动到老年区,当 JVM 内存不够用的时候,会触发 Full GC,清理 JVM 老年区

当新生区满了之后会触发 YGC,先把存活的对象放到其中一个 Survive区,然后进行垃圾清理。因为如果仅仅清理需要删除的对象,这样会导致内存碎片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候,就会使用下一个 Survive,这样循环使用。如果有特别大的对象,新生代放不下,就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存活时间一般比较久远。

堆空间逻辑上分为三部分,但实际上还是新生区和老年区两部分,元空间(永久代)属于方法区

JMM内存模型 / JVM 内存区域_开发语言_05

java8之前,永久区,堆内存

JMM内存模型 / JVM 内存区域_jvm_06

java8和8之后,更名为元空间,物理内存 

JMM内存模型 / JVM 内存区域_开发语言_07

3. 堆和栈的区别

栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆
是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在
区域不连续,会有碎片
1)功能不同
栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变
量,还是类变量,它们指向的对象都存储在堆内存中。
2)共享性不同
栈内存是线程私有的。 堆内存是所有线程共有的。
3)异常错误不同
如果栈内存或者堆内存不足都会抛出异常。 栈空间不足:java.lang.StackOverFlowError。 堆空间不足:java.lang.OutOfMemoryError。
4)空间大小
栈的空间大小远远小于堆的。
 

标签:Java,对象,虚拟机,线程,内存,JVM,JMM
From: https://blog.51cto.com/u_15905340/5919897

相关文章

  • JVM小总结
    ......
  • JVM调优
    0.准备0.1三个属性(吞吐量、延迟、内存)中选择其中两个进行jvm调优,称之为GC调优3选2.吞吐量:用户代码时间/(用户代码执行时间+垃圾回收时间)。是评价垃圾收集器能力的重要......
  • Windows系统服务器虚拟内存如何设置
    Windows系统服务器虚拟内存如何设置​一、什么是虚拟内存?虚拟内存有什么用处?​操作系统中所运行所有的程序全部都是经过内存提交给CPU然后才执行的,不过若是执行的程序占用内......
  • 二维数组在内存中的存储
    #include<stdio.h>#include<string.h>#include<math.h>#include<stddef.h>intmain(){ intarr[3][4]; inti=0; for(i=0;i<3;i++) { intj=0; for(j=0;j<......
  • InitInstance中创建CWnd派生的窗口对象,内存泄漏
    问题MFC程序中,在主程序类的InitInstance中创建由CWnd派生的CMyWnd窗口对象,程序关闭时,在vs的输出窗口报告有内存泄漏。分析单文档、多文档程序都是在InitInstance中new出主窗......
  • JVM内存模型
    #JVM内存模型如何分配的##JVM内存模型的划分> 由于我们生产环境使用的虚拟机HotSpot居多,所以下面的描述都是基于HotSpot虚拟机而言的,对于其他类型的虚拟机,如JRockit(O......
  • JVM 的主要组成部分及其作用
     JVM包含两个子系统和两个组件,分别为:Classloader(类装载子系统):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区的方法区中。Executionengi......
  • java面试(JVM)
     1. JMM的两个语义1)happensbefore:一个线程前一个操作对后一个操作可见,具有传递性。确保多线程执行程序结果不变。2)asifserial:无论怎么重排序,程序执行结果不变,即不......
  • Jvm上如何运行其他语言?JSR223规范最详细讲解
    一在Java的平台里,其实是可以执行其他的语言的。包括且不仅限于jvm发展出来的语言。有的同学可能会说,在java项目里执行其他语言,这不吃饱了撑着么,java体系那么庞大,各种工具......
  • 如何以时间间隔捕获CPU,procrank,内存和顶级信息?
    我们处理了一些在money或稳定性测试中复制的软件监督问题。根据logcat,内核和跟踪日志分析,SWWD阻塞的线程的回溯不是固定的。在换句话说,阻塞的线程在特定功能中不会被阻塞。......