Java内存模型(JMM)和虚拟机(JVM)内存、GC

凌晨与风 2021-01-22 18:21:40
java 虚拟机 模型 内存 JMM


在面试过程中,关于Java的内存模型(侧重于:Java的并发原理)和JVM的内存模型并不是同一个问题,所以自己在通过查询资料之后对相关的知识点进行总结,如果有写得错误的地方,欢迎指出,也可以一起探讨。

基于计算机的内存设计结构,CPU在发展过程中,运行速度越来越快,内存的读写速度跟不上CPU的运行速度,因此提出来“缓存” 的概念。CPU在读写过程中,可以将数据先写入缓存中,然后缓存将数据刷新到主存中。因此,在多线程的场景下就会出现“缓存不一致的情况”,就是多个线程对同一个数据的缓存可能不一致。

基于数据的安全,需要满足原子性、可见性、有序性

再具体的关于CPU和内存之间的爱恨纠缠目前我就没有在深入,感兴趣的同学可以自己去了解一下

 

Java内存模型(JMM)

·· Java内存模型就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异,保证了Java程序在各种平台下对内存的访问都能保证其效果一致的机制和规范

首先提一下三个概念,基本上内存模型就是为了解决这三个问题

原子性:一个操作中CPU不能暂停、中断,要么执行完成,要么不执行

可见性:多个线程访问同一个变量时,一个线程对变量进行修改之后,其他线程能够立即看到修改后的值

有序性:程序按照顺序执行代码

 

总结:JMM是一种规范,用于处理多线程共享内存时存在内存和缓存数据不一致的问题

 

Java内存模型如何实现

Java中提供了一系列和并发相关的关键字,比如:volatilesynchronizedfinalconcurren

其实这些就是Java内存模型封装在底层中实现后提供给程序员使用的关键字

 

本文的重点在于了解JMM,所以不会对相关的关键字进行详细的介绍!!!!

 

synchronized 用于保证 原子性

volatile 用于保证可见性

volatile 和synchronized  都可以实现可见性

 

JVM内存模型

Java虚拟机將管理的内存分成了五大区域:

 

 

 

1.程序计数器

概念:程序计数器是一块很小的内存空间,它是线程私有的,可以认作为当前线程的行号指示器。

目的:CPU在执行多线程任务时,为了确保线程能够正常切换到正确的执行位置,每个线程都有一个独立的程序计数器,不同线程之间的程序计数器互不影响,独立存储。

注意:如果线程执行的是个java方法,那么计数器记录虚拟机字节码指令的地址。如果为native【底层方法】,那么计数器为空。这块内存区域是虚拟机规范中唯一没有OutOfMemoryError的区域

 

2.Java栈(虚拟机栈)

概念:栈描述的是Java方法执行的内存模型,每个方法在被执行的时候都会创建一个自己的内存栈用于存放局部的变量等相关信息,存放的方式是逐个存放,所以这里有个栈先进后出的过程。

当方法执行完成之后,内存栈被销毁,所以方法中定义的变量都是放置在内存栈中。

3.堆

概念:堆是Java虚拟机中内存最大的一个块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候也需要同步机制。所有的对象实例及数组大多数都是在堆上分配内存,之所以不是都是这样,原因在于JIT编译器技术的成熟,这个说法不是这么绝对了。

 

注意:为什么会有栈和堆之分:

当一个方法执行时,每个方法都是建立自己的内存栈用于存放方法中定义的变量,在方法结束后进行销毁,但是在程序中创建一个对象时,这个对象将被保存在堆中(也可以称为:运行时数据区,堆是其中的一部分),方便可以反复的使用,这是因为创建对象的成本通常会比较的大。既让这样,那么在堆内存的中的对象就不会随着方法的结束而销毁,当这个对象被一个方法引用完了之后还可能被其他的引用变量使用,则这个对象就不会被销毁。只有在一个对象没有任何的引用变量引用他时,系统的垃圾回收机制才会在合适的时候回收他(是不是听起来很熟悉,特别的像GC)

 

4.方法区

概念: 方法区和堆的概念比较类似,就是所有线程共享的内存,为了和堆进行区分,又被称为了“非堆”

目的:用于存储已被虚拟机加载的类信息、常量、静态变量

 

5.本地方法栈

概念:本地方法栈是与虚拟机栈发挥的作用十分相似,区别是虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++,我们打开jdk安装目录可以看到也有很多用c编写的文件,可能就是native方法所调用的c代码。

 

GC:java GC泛指java的垃圾回收机制,该机制是java与C/C++的主要区别之一

目的:为了解决内存泄露的问题(尽量解决,毕竟该泄露的还是会泄露)

GC这边我就不做详细的介绍了,毕竟自己也在学习过程中,GC是可以拿出来讲好久的内容,目前我还没有进行总结。

版权声明
本文为[凌晨与风]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/zhu-qi/p/14314723.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云