主要澄清之前对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 89

    回溯写到自闭:不想就删了: class Solution { public: vector<int> grayCode(int n) { vector<vector<int&g ...

  2. create view

    create view View_count as SELECT     spkfk.spid, pf_ckmx.rq, pf_ckmx.spid AS Expr1, pf_ckmx.shl, spk ...

  3. Pandas DataFrame 数据选取和过滤

    This would allow chaining operations like: pd.read_csv('imdb.txt') .sort(columns='year') .filter(lam ...

  4. Java-Runtime 类

    https://www.cnblogs.com/slyfox/p/7272048.html Java-Runtime 类 Runtime 类代表着Java程序的运行时环境,每个Java程序都有一个Ru ...

  5. PHP:第二章——PHP中的流程控制语句

    if语句的集中形式 <?php /*if(条件) 语句; if(条件){语句块} if(条件){语句或语句块}else{语句或语句块} if(条件){语句或语句块}elseif(条件){语句或语 ...

  6. RK3288 GMAC整理

    一.源文件 源码路径:\drivers\net\ethernet\rockchip\gmac 源码阅读顺序: 二.重要探针函数stmmac_dvr_probe 1. alloc_etherdev 申请 ...

  7. Python实现简单的爬虫获取某刀网的更新数据

    昨天晚上无聊时,想着练习一下Python所以写了一个小爬虫获取小刀娱乐网里的更新数据 #!/usr/bin/python # coding: utf-8 import urllib.request i ...

  8. python3 scrapy 爬取腾讯招聘

    安装scrapy不再赘述, 在控制台中输入scrapy startproject tencent 创建爬虫项目名字为 tencent 接着cd tencent 用pycharm打开tencent项目 ...

  9. select into from和insert into from

    最近在研究oracle function 时发现select into from和insert into from,这样的语句,于是上网查阅资料学习了一下, 原来两种表达式均可以达到复制整个表或表的一 ...

  10. Java中线程同步的方法

    同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态. 注 ...