JVM内存模型(一)

时间:2023-01-06 21:59:54
主要澄清之前对JVM内存模型的一些误区:
JMV内存主要分为5块:方法区(Method Area),堆区(Heap),虚拟机栈(VM stack),本地方法栈(Native Method stack),程序计数器;
JVM内存模型(一)
可以看到内存整体可以划分为共享区和私有区;共享区其实就是堆(年轻带,老年代)和方法区(即PermGen或者说Metaspace区),共享区是GC处理的范围;私有区则是指的每个线程私有的内存空间,这部分内存的释放不需要GC,有JVM判断作用范围到了后自动释放。另外私有和公有区抛出的内存溢出的异常也是不一样,前者是StackOutflowError(栈的溢出异常),后者则是OutOfMemoryError;这个是堆的内存分配异常。
下图比较明确的展示了那些JVM的内存部分是私有的,那些是共有的。PC计数器,栈(jvm栈以及本地方法栈)是每个线程私有的;
JVM内存模型(一)
 
首先年轻代(Eden,S0,S1),老年代,这个说法只是针对“堆”区而言;其实对于那些临时变量的索引,primary type(int,float等)都是分配在栈,分配在什么站?虚拟机栈,本地方法栈(这两个栈很多VM都是合二为一);所以堆和栈只有前者是在GC的“代”中存放,只有堆区里面的对象才有代的概念;
那么栈里面的数据怎么处理?一般放在栈里面的数据(虚拟机栈)都是临时变量,当作用域范围结束后,直接就可以被回收;之所以可以被回收就是因为这部分量还是比较小;对于堆中的数据要采用“代”的机制,就是因为这里面的对象数据比较复杂,生命周期长短不一,如果每次都是全盘扫描一遍(下面介绍的mark-delete-copy或者mark-delete-compact)的处理模式,效率太低了;于是基于经验,如果一个数据一段时间没有被回收,那么可能很久都不会被回收,于是有了“代”这种概念,代越高,被扫描的间隔就越长;这个也是分区的目的。
之前一直觉得GC收集策略中的标记(mark)-清除(delete)-复制(copy)没有标记-(清除)-压缩好用,只是作为介绍性说明;但是其实年轻代就是使用这个标记(mark)-清除(delete)-复制(copy)机制;对应的,老年代采用的标记-(清除)-压缩机制;这个一点其实在使用JVVM的时候,已经看到了,Eden里面数据不断地被回收,没有被回收的放置到了s0,s0再放到s1这些都是赋值(swap)的过程;对于老年代算法比较清晰,其实就是我们讲述自己玩,没有赋值,回收之后,再紧凑一下(compact)。
方法区对应的就是PermGen,以及到了jdk8时代的Metaspace,主要是常量,类信息,通过getName,isInterface等方式来获得类信息操作都是通过访问PemGen(Metaspace)获取的;注意,PermGen里面还包含类信息;
最后一个就是GC的收集器;
首先是CMS,这个是用于老年代/PerGem的回收;我恨,之前一直理解是新生代和老年代都是用这种策略回收;
然后是各个收集器作用范围,清晰了一下:
串行收集器(Serial),一般用于JVM客户端模式,就是单线程回收,比较节省资源,但是性能不高;
并行(Parallel)收集器,多线程回收。
收集器
适用的代
采用的收集算法
适用的模式
串行、并行、并发
目标
Serial
Young
复制
Client
用户线程停止,收集线程串行
GC时停顿时间少
ParNew(Parallel New Generation)
Young
复制
Server
用户线程停止,收集线程并行
GC时停顿时间少
Parallel Scavenge
Young
复制
 
用户线程停止、收集线程并行
吞吐量尽可能大
CMS
Old
标记-清除
 
用户线程和收集线程均在执行,前者不用停止
GC时停顿时间少
Serial Old(MSC)
Old
标记-整理
Client、Server
用户线程停止,收集线程串行
GC时停顿时间少
Parallel Old
Old
标记-整理
 
用户线程停止,收集线程并行
吞吐量尽可能大
G1
Young、Old
标记-整理
Server
用户线程和收集线程均在执行,前者不用停止
GC时停顿时间少
 
JVM内存模型(一)
参考
一篇图文并茂的介绍JVM的博客,本文里面的收集器的表格来自于此
知乎上面一堆大神的介绍,本文中的分区图就是来自于这篇问答
 

JVM内存模型(一)的更多相关文章

  1. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  2. JVM内存模型和性能优化 转

    JVM内存模型和性能优化 JVM内存模型优点 内置基于内存的并发模型:      多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于 ...

  3. JVM内存模型和性能优化

    JVM内存模型优点 内置基于内存的并发模型:      多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁. 多核并行计算模 ...

  4. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  5. JVM内存模型和关键参数设置

    一. JVM内存模型: Jvm内存模型是学好Java很重要的一部分,该部分学习能让我们在系统运维的时候,或者优化服务器的时候能够有方法,懂原理. 二. Jvm关键参数: 1. 堆大小设置参数: -Xm ...

  6. 记录JVM内存模型,参数含义和优化

    一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...

  7. 【转】JVM内存模型

    http://longdick.iteye.com/blog/473866 图解JVM内存模型 博客分类: JVM JVM活动SUN  /** *  转载请注明作者longdick    http:/ ...

  8. jvm内存模型和内存分配

    1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的. (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和 ...

  9. JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集

    (转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...

  10. Java基础知识强化100:JVM 内存模型

    一. JVM内存模型总体架构图:  方法区和堆由所有线程共享,其他区域都是线程私有的 二. JVM内存模型的结构分析: 1. 类装载器(classLoader) 类装载器,它是在java虚拟机中用途是 ...

随机推荐

  1. 完美替换win8.1 x64默认雅黑为宋体方法

    由于显示器不好,安装win8.1 x64系统后,系统默认的雅黑字体实在是看不习惯, 时间稍一常眼睛就发累,还是一直用的xp宋体好,于是寻思着能不能将默认雅黑换成宋体. 网上倒是搜出了许多win7的修改 ...

  2. Apache Spark 架构

    1.Driver:运行 Application 的 main() 函数并且创建 SparkContext. 2.Client:用户提交作业的客户端. 3.Worker:集群中任何可以运行 Applic ...

  3. IIs站点的建立

    控制面板——管理工具——Internet信息服务管理器 首先应设置的文件权限:System 和 admin 程序池:4.0 编辑权限:iis apppool\名称 身份验证:匿名身份——应用程序池标识

  4. C# Attribute(特性)之---契约---[ServiceContract] 、 [OperationContract]

    代码如下 : [ServiceContract] //服务协定定义 using System.ServiceModel; public interface IInterface1 { [Operati ...

  5. 小米2S TWRP 3.0.2-0 最新中文版本Recovery

    注意:此版本为合并分区后的twrp  小米2S 合并分区教程:http://forum.xda-developers.com/mi-2/orig-development/flashtools-mifl ...

  6. 关于相机拍照获取图片onActivityResult返回data 为null的问题

    调用相机拍摄方法 /** * capture new image */ protected void selectPicFromCamera() { if (!EaseCommonUtils.isSd ...

  7. Hibernate基础增删改查语法

    1.创建好Hibernate项目,创建好实体类和测试类,如果不会创建Hibernate项目的同学,点此处:http://www.cnblogs.com/zhaojinyan/p/9336174.htm ...

  8. 7.7 C++基本关联式容器

    参考:http://www.weixueyuan.net/view/6404.html 总结: 基本的关联式容器主要有:set.multiset.map和multimap,这四种容器可以分为两组:ma ...

  9. 安装chrome扩展json-handle

    chrome插件安装 方式一,在线安装 直接插到json-handle地址,添加即可 https://chrome.google.com/webstore/detail/json-handle/iah ...

  10. POJ 2845

    #include <iostream> #include <string> #include <algorithm> #define MAXN 350 using ...