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内存各个区域简单介绍: 程序计数器:程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 在使用多线程时,为了线程切换后能恢复到正确的执行位置,每条线程都需要有个独立 ...
随机推荐
- C# Task 用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- android 资讯阅读器
最近找申请到了一个不错的接口 , 非常适合拿来写一个资讯类的app. 现在着手写,随写随更.也算是抛砖引玉.烂尾请勿喷.╭(╯^╰)╮ android 资讯阅读器 第一阶段目标样式(滑动切换标签 , ...
- Beta版本冲刺Day6
会议讨论: 628:配置Mysql的时候遇到了问题,在修改数据库用户密码时无法修改,并且服务器好像连接不上去了,其他组员则继续他们的任务.601:将一些原来的界面进行了修改,修改成了更加美观的外形. ...
- Android下常见动画
摘要:Android中常见的的动画有三种:属性动画.补间动画.帧动画. 注.因为前两种内容较多,后补 一.属性动画 二.补间动画 三.帧动画:本质是将一些连贯的图片加载形成连贯的动画效果 1.在Dra ...
- 基于tiny4412原生uboot修改制作SD启动并烧写到emmc
最近入手tiny4412的标准板,底板SDK型号为1506.但是因为友善之臂提供的superboot不能进入boot菜单,此时我就不能通过tftp下载内核和通过nfs挂载根文件系统,于是想自己做个ub ...
- linux基础学习2
http://www.chengzhier.com <a href="http://www.chengzhier.com">橙汁儿网</a> 1. date ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- Django- 1- 数据库设置
更改配置文件中的 字段更改为 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', //按照自己的数据库配置配置,现在所配置 ...
- IntelliJ_13书签
一.书签视图 二.使用方法 1.添加书签:Ctrl+Shift+数字 2.跳转到书签:Ctrl+数字 来自为知笔记(Wiz)
- win7如何让局域网其他电脑通过IP直接访问自己电脑的网站
一.打开控制面板 二.打开防火墙 三.点击右侧高级设置 四.点击防火墙属性 五.点击防火墙状态选择为关闭,确定 六.点击右侧允许或功能通过windows防火墙 七.执行第六部会打开防火墙通信例外窗口, ...