1、首先简单说一下CPU与内存之间的关系

CPU运转速度快,磁盘的读写速度远远不及CPU运转速度,所以设计了内存来缓冲CPU等待磁盘读写;随着CPU的发展,内存读写也远远跟不上CPU的读写速度,CPU生产商就在每颗CPU上加了高速缓存来缓解这种症状,便出现了上图结构。高速缓存的出现很好的解决了CPU与内存之间的矛盾。

多处理器的出现引入缓存不一致的新问题,也就是多个CPU同时处理一块内存区域的时候就可能发生缓存不一致现象。为了解决这一问题,那就要求处理器运行的时候遵循某些协议来保证数据一致性。如下图

协议就是规定CPU对主存数据操的作状态如何记录,便于CPU正确读取内存数据

2、JVM内存模型与物理机处理操作基本一致

java 通过多线程机制使得多个任务同时执行处理,所有线程共享JVM内存区域的main memory(主存),每个线程又有自己的独立工作内存,线程与内存交互时,数据先从主内存拷贝到线程工作内存,然后再交给线程处理。

2、JVM逻辑内存模型,即JVM如何划分内存,并处理数据的

(1)、程序计数器

一小块内存,可以看作是当前线程所执行字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条要执行的字节码指令,分支、跳转、循环、异常处理、线程恢复等基础功能都需要依赖这个计数器。

JVM多线程是通过轮流切换并分配处理器执行时间方式来实现,一个处理器(单核)某时刻只能执行一条线程指令,在多线程切换后能恢复到正确的执行位置,每个线程就需要有独立的程序计数器,线程之间互不影响。

(2)、java虚拟机栈(java栈)

java栈和程序计数器一样,是线程私有的,生命周期与线程相同。虚拟机栈描述的是java方法执行的存储模型,每个方法执行的时候都会创建一个栈帧,存储局部变量、操作栈、动态链接、方法出口等信息,方法执行至结束的过程,也就是栈帧从入栈到出栈的过程。

局部变量内存空间在编译期间就分配好了,如果运行期间内存不够可以动态扩展,但是如果请求内存大于虚拟机规定内存大小抛出异常StackOverflowError,如果动态扩展,请求内存不够用则抛异常OutOfMemoryError。

(3)、本地方法栈

本地方法栈与虚拟机栈发挥作用一样,区别就是本地方法栈是为调用Native方法(非java方法,如操作系统内方法或其他程序C、C++等方法)服务,虚拟机栈是为调用java方法服务

(4)、java堆

对于大多数应用来说,java堆是JVM管理内存中最大的一块,在启动的时候就创建好了(主流虚拟机都可以通过-Xmx和Xms动态扩展),而且为所有线程共享。java堆唯一目的就是存放对象实例,虽然虚拟机规范中描述,所有的对象实例及数组都要在堆上分配,但随着技术发展,栈上分配、标量替换技术将会导致微妙变化。GC堆(垃圾回收管理器)的主要区域也在堆上。java堆中数据存储物理上是可以不连续的,而逻辑上连续。

(5)、方法区

方法区与java堆一样,为所有线程共享,不需要连续内存管理数据,主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。为了与java堆区别开,别名叫NonHeap(非堆)

(6)、运行时常量

属于方法区一部分,Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项是信息常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

JVM内存简单理解的更多相关文章

  1. JVM 内存机制理解【转自http://www.cnblogs.com/dingyingsi/p/3760447.html】

    我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...

  2. JVM内存简单总结

    根据自己的认识,简单总结下Java中的数据存储及内存分析. Java中的内存大致可以分为三块:栈内存.堆内存.方法区内存,看图说话. 1).栈 栈(stack):栈是限定仅在表头进行插入和删除操作的线 ...

  3. JVM内存基本理解

    声明:本文内容仅作为本人方便记忆和查看所用. JVM有五块内存空间: 1.method area:用于存储已被加载的类信息.常量.静态变量.即时编译后的代码等数据. 注:在JDK8中,Method A ...

  4. java之JVM学习--简单理解编译和运行的过程之概览

    java代码编译流程图: java字节码执行由JVM执行引擎完成 Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Jav ...

  5. 你应该这样理解JVM内存管理

    在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...

  6. 深入理解JVM内存区域与内存分配

    前言:这是一篇关于JVM内存区域的文章,由网上一些有关这方面的文章和<深入理解Java虚拟机>整理而来,所以会有些类同的地方,也不能保证我自己写的比其他网上的和书本上的要好,也不可能会这样 ...

  7. 深入理解JVM之JVM内存区域与内存分配

    深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...

  8. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

  9. JVM内存各个区域分工简单介绍

    JVM内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立 ...

随机推荐

  1. c# 获取网页源码

    C#获取指定网页HTML原代码可使用 WebClient WebRequest HttpWebRequest 三种方式来实现. 当然也可使用webBrowse!在此就不研究webBrowse如何获取了 ...

  2. myeclipse下java文件乱码问题解决

    中文乱码是因为编码格式不一致导致的.1.进入Eclipse,导入一个项目工程,如果项目文件的编码与你的工具编码不一致,将会造成乱码.2.如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文 ...

  3. scrum阶段总结

    项目预期计划: 确定编码规范. 根据原型图,设计并实现UI,添加各个界面,按钮,对话框,列表,窗口,导航等,理清各个界面的跳转逻辑. 学习测试技巧,编写测试用例. 实现需求文档中提出的功能,分别为:景 ...

  4. JNI系列——简便开发流程

    1.编写Java代码 2.选中工程目录--右键单击Android Tools--Add Native Support 3.输入要生成的库名 4.到工程目录中jni目录下对自动生成文件和.mk文件进行相 ...

  5. JVM执行Java程序时内存的划分

    Java虚拟机在执行Java程序过程中会把它所管理的内存区域划分为若干个不同的数据区域. Java虚拟机所管理的内存包括以下几个运行时区域: 1.程序计数器(Program Couter Regist ...

  6. 【BZOJ 1503】【NOI 2004】郁闷的出纳员

    $Splay$模板题. 复习一下伸展树的模板. 一定不要忘了push啊!!! 对于减工资后删掉员工的操作,我选择插入一个$min+delta_{减少的工资}$的节点,把它$Splay$到根,砍掉它自己 ...

  7. [转]JVM调优总结:一些概念

    JVM调优总结:一些概念 原文出处: pengjiaheng 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变 ...

  8. Visual Studio 2015正式版/产品密钥

    Visual Studio 2015  发行说明: https://visualstudio.com/zh-cn/news/vs2015-vs.aspx Visual Studio  2015 特性简 ...

  9. pch文件的使用

    pch文件的应用场景:1.用来定义一些全局的宏2.用来导入一些全局都能访问的头文件(如果只需要让.m或者.mm文件访问到,不需要让.c文件访问到,那么需要把头文件写到#ifdef _OBJC_ #en ...

  10. 【caffe】cifar10例子之quick_train.sh在windows下的解决方案

    @tags caffe 照例还是转写为python脚本: import os caffe_root=os.environ['caffe_root'] caffe_build=os.environ['c ...