主要澄清之前对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. 这可能是最简明扼要的 js事件冒泡机制+阻止默认事件 讲解了

    哎 js事件冒泡机制和阻止冒泡 阻止默认行为好像永远也整不清楚,记了忘 忘了记...醉了 这篇文章写完以后下次再忘记 就呼自己一巴掌,忘一次一巴掌 首先要明白两个概念——事件和事件流 事件指的是用户或 ...

  2. UVALIve 5987 素数

    题目链接:Distinct Primes 如果一个数.至少有三个因子是素数..那么这个数就是prime num.30和42是前两个prime num.问你第n个这种数是谁.(1<=n<=1 ...

  3. EntityFramework 6

    3.EF6 3.1初步目录及说明 下面是用VS2013开发环境创建的项目: 说明:控制台项目类型,安装 EF版本为6.1.3 , 数据库连接字符串配置: 隐藏代码 <connectionStri ...

  4. Android中aar和jar文件的认识

    在Android开发中,我们总是会引入其他第三方的库或者资源等,有时候是添加一个jar文件,有时候添加一个aar文件,那么这两种类型的文件有什么区别吗?详情请看下文. 一.描述. 1.   *.jar ...

  5. [转载]oracle建表语句大全

    原文URL:http://blog.csdn.net/haiross/article/details/11772847 Oracle创建表语句(Create table)语法详解及示例   创建表(C ...

  6. mybatis 传递多个值的解决办法

    参考链接:http://www.2cto.com/database/201409/338155.html. 其中三种方案是正确的,有些例子的细节是错的,但是无关紧要

  7. java中的块

    之前没听过这个概念 块是java类中不太常见的一个元素.声明方式与方法体类似,分为static块和实例块两种. 实例块: {块体} 实例块不能直接调用,每一次调用构造方法创建对象的时候,都会在调用构造 ...

  8. SharePoint SSS(Security Store Service)服务-PowerShell

    1. 获取SSS应用程序的标识 Get-SPServiceApplication 2. 获取指定的SSS应用程序实例 $sss = Get-SPServiceApplication -Identity ...

  9. android:Unsupported major.minor version 52.0

    错误描述 使用android studio项目编译过程报如下错误: java.lang.UnsupportedClassVersionError: com/android/build/gradle/A ...

  10. 正则表达式,清除HTML标签,但要保留 <br>和<img>标签,其他的清除

    最近有个需求, 要替换到html当中的除了br和img以外的所有标签, 遂百度之, 在百度知道遇到大神 , 在这记录一下 /<(?!\/?br\/?.+?>|\/?img.+?>)[ ...