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内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立 ...
随机推荐
- python基础-基本数据类型总结_整型(int)_字符型(str)_day3
一.基本数据类型 1.整型(int) ps1:数字 int ,所有的功能,都放在int里a1 = 123a1 = 456 ps2: int 将字符串转换为数字 # -int # 将字符串转换为数字 ...
- cxf和jaxws的对比
和jaxws相比,服务器发布方式和客户端访问方式不同 以下是cxf的代码: 服务器发布方式: package service; import javax.xml.ws.Endpoint; import ...
- Ibatis的环境搭建以及遇到的问题解决
新建Java项目IbatisTest,加入Mysql和ibatis的驱动包; 在数据库中新建一张表student表,添加字段sid.sname.major.birth; 在java项目中添加bean对 ...
- SQL 常用函数及示例
--SQL 基础-->常用函数 --================================== /* 一.函数的分类 SQL函数一般分为两种 单行函数 基于单行的处理,一行产生一个结果 ...
- 【BZOJ 2157】旅游
再水一道模板题,明天就要出发去参加二轮省选了赶紧复习复习模板. 链剖模板题,可是写链剖太麻烦了,还是写lct吧. 但这个lct比较麻烦了,因为边权有正有负,要统计最大值和最小值,这样点权赋为什么值都会 ...
- python中的二维数组和lamda
python列表推导式 list=[[0 for i in xrange(3)] for j in xrange(4)] 二维数组 g=lambda x,y:x*y; print g(2,9);
- 编译php5.4的时候出现错误----configure: error: in `/usr/local/src/php540/php-5.4.0':
错误如下:checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep - ...
- 使用kuernetes提供高可用的kibana服务
在kubernetes集群中部署kibana步骤如下: 1:kibana安装文件(目前最新版本4.5.1): 2:编写Dockerfile及执行点脚本文件run.sh,制作Kibana镜像: 3:推送 ...
- redis事务
当一个client在连接中发出multi命令时,这个连接就进入一个事务的上下文,该连接后续的命令不会执行,而是存放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令.如果其中执 ...
- Linux下eclipse提示快捷键失效解决办法
在window->Preferences->general->keys中, 找到 content asist 修改下边值 Binding 改成 Alt+/ When 改为 Editi ...