JVM内存简单理解
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内存简单理解的更多相关文章
- JVM 内存机制理解【转自http://www.cnblogs.com/dingyingsi/p/3760447.html】
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...
- JVM内存简单总结
根据自己的认识,简单总结下Java中的数据存储及内存分析. Java中的内存大致可以分为三块:栈内存.堆内存.方法区内存,看图说话. 1).栈 栈(stack):栈是限定仅在表头进行插入和删除操作的线 ...
- JVM内存基本理解
声明:本文内容仅作为本人方便记忆和查看所用. JVM有五块内存空间: 1.method area:用于存储已被加载的类信息.常量.静态变量.即时编译后的代码等数据. 注:在JDK8中,Method A ...
- java之JVM学习--简单理解编译和运行的过程之概览
java代码编译流程图: java字节码执行由JVM执行引擎完成 Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Jav ...
- 你应该这样理解JVM内存管理
在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...
- 深入理解JVM内存区域与内存分配
前言:这是一篇关于JVM内存区域的文章,由网上一些有关这方面的文章和<深入理解Java虚拟机>整理而来,所以会有些类同的地方,也不能保证我自己写的比其他网上的和书本上的要好,也不可能会这样 ...
- 深入理解JVM之JVM内存区域与内存分配
深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
- JVM内存各个区域分工简单介绍
JVM内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立 ...
随机推荐
- git diff命令
1. 比较两次提交的差异 2. 两个分支之间的比较 3. 暂存区和版本库的比较
- python中的字符数字之间的转换函数
int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) ...
- 如何知道某个网站的IP地址
命令行窗口得到ip地址 1按键盘上的win键(alt键左面的小窗口)+R键 调用运行 2输入cmd 确定 调用系统的 命令行窗口 3在命令行窗口里输入 ping + 空格键 + www.*****.c ...
- 10 函数的复写-override
1.函数的复写:override 2.使用super调用父类的成员函数 class Person { String name; int age; void introduce() { System.o ...
- 【POJ 1679】The Unique MST(次小生成树)
找出最小生成树,同时用Max[i][j]记录i到j的唯一路径上最大边权.然后用不在最小生成树里的边i-j来替换,看看是否差值为0. #include <algorithm> #includ ...
- TCP连接——爱的传声筒
TCP连接——爱的传声筒 TCP通信最重要的特征是:有序(ordering)和可靠(reliable).有序是通过将文本流分段并编号实现的.可靠是通过ACK回复和重复发送(retransmission ...
- js-JavaScript高级程序设计学习笔记14
第十六章 HTML5脚本编程 1.跨文档消息传递.简称XDM,指的是来自不同域的页面间传递消息. XDM的核心是postMessage()方法,接收两个参数,一条消息和消息接收方来自哪个域的字符串. ...
- ubuntu16.04+cuda7.5
0 安装了ubuntu16.04 GT980的显卡,安装了nvidia340的驱动 1 下载cuda7.5的.run文件 2 进入tty1,service stop lightdm 3 sudo sh ...
- 【BZOJ-2427】软件安装 Tarjan + 树形01背包
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 960 Solved: 380[Submit][Status ...
- UOJ263 【NOIP2016】组合数问题
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...