主要澄清之前对JVM内存模型的一些误区:
JMV内存主要分为5块:方法区(Method Area),堆区(Heap),虚拟机栈(VM stack),本地方法栈(Native Method stack),程序计数器;
可以看到内存整体可以划分为共享区和私有区;共享区其实就是堆(年轻带,老年代)和方法区(即PermGen或者说Metaspace区),共享区是GC处理的范围;私有区则是指的每个线程私有的内存空间,这部分内存的释放不需要GC,有JVM判断作用范围到了后自动释放。另外私有和公有区抛出的内存溢出的异常也是不一样,前者是StackOutflowError(栈的溢出异常),后者则是OutOfMemoryError;这个是堆的内存分配异常。
下图比较明确的展示了那些JVM的内存部分是私有的,那些是共有的。PC计数器,栈(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内存模型(一)的更多相关文章

  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. Leetcode 96

    class Solution { public: int numTrees(int n) { ]; dp[] = ; dp[] = ; dp[] = ; ;i <= n;i++){ ; ;j & ...

  2. ** exception error: no match of right hand side value

    错误发生的情况是模式匹配失败.对于badmatch异常,很难找到单一的原因,但经常性的原因是你无意间尝试绑定已绑定过的变量.

  3. CentOS7系统更换YUM Repo源

    CentOS7系统更换YUM Repo源 备份原镜像 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.re ...

  4. 用实例说明Spark stage划分原理

    注意:此文的stage划分有错,stage的划分是以shuffle操作作为边界的,可以参考<spark大数据处理技术>第四章page rank例子! 参考:http://litaotao. ...

  5. sql server中如何将两个字段数据合并成一个字段显示(字段与字段添加特殊符号)

    之前,我在做统计数据时,需要一个字段显示某月的订单数量和订单金额,要求组合成一个字段,用括号组合. 统计出来的结果大概是这样的,首先我们来创建一些模拟数据 ---创建订单表--- create tab ...

  6. PHP:第一章——php中的变量001 /普通赋值/引用赋值/php变量的检查与销毁

    <?php //php中的变量: //php中的变量用一个美元符$后面紧跟着变量名来表示,变量名是区分大小写的. //有效的变量只能是字母或者下划线开头,后面跟任意数量的字母.数字.或者下划线. ...

  7. HDU 4791 Alice's Print Service 思路,dp 难度:2

    A - Alice's Print Service Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  8. EXCEL FAQ

    1.win7双击打开EXCEL07时显示停止工作,但是在打开方式中可以打开,怎么破? 加载项的问题,在选项-信任中心-信任中心设置-加载项-禁用所有应用程序加载项即可,但是这样会丧失一些功能,也可以把 ...

  9. 亚马逊Kindle正式进入中国

    6月7日下午消息,亚马逊Kindle今天下午4点正式发售.其中,Kindle电子阅读器和Kindle Fire平板电脑同步销售.Paperwhite售价最低849元,Kindle Fire HD售价最 ...

  10. maven加载本地jar

    [问题描述] 由于对接公司外部产品,导致公司内网上的maven库中并不存在对应的SDK jar,因此,需要通过maven加载本地jar的方式来实现工程编译. [方法] 方法很简单, 1.在resour ...