主要澄清之前对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. python daal test

    import os import sys from daal.algorithms import low_order_moments from daal.data_management import ...

  2. Vue--- 手动禁止ESlint

    使用vue-cli构建项目时,通常会问你要不要 “Use ESlint to lint your code?” 建议使用,这样会有助于规范我们的代码(这也是一种审美),ESlint的规范就不说了,写多 ...

  3. spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战

    SpringBoot + Redis +SpringSession 缓存之实战 前言 前几天,从师兄那儿了解到EhCache是进程内的缓存框架,虽然它已经提供了集群环境下的缓存同步策略,这种同步仍然需 ...

  4. winform窗体程序运行后怎样隐藏?

    运行winform窗体,我们是怎样隐藏的呢? 例子: 1)创建简单winform窗体 2)编写隐藏窗体程序的代码 3)效果演示 1)创建一个简单的winform窗体MainForm,

  5. 浅谈Obejct.assign

    Object.assign属于浅拷贝 Object.assign只能拷贝:可被枚举的属性,自有属性,string或者Symbol类型是可以被直接分配的 var ab={ name:"没有被覆 ...

  6. sgu 130Circle dp

    130. Circle time limit per test: 0.25 sec. memory limit per test: 4096 KB On a circle border there a ...

  7. Windows折腾之路 兼谈纯净强迫情节

    早期新鲜感 想当年,终于有了第一台属于自己自由处置的电脑,1.2Ghz的CPU,256兆的内存.这在CPU刚刚上1G的年代,不说顶级,也算主流.操作系统呢,在别人的帮助下,装上新鲜的XP,各种的华丽, ...

  8. 自定义iconfont 图标库下载本地在移动App的使用及svg彩色图标

    自定义iconfont 图标库扩展 在Hbuilder开发移动App的使用及svg彩色图标(或mui图标库的自定义扩展) 前提准备:1.登录阿里iconfont图标库,创建自己的项目,地址:http: ...

  9. L221

    Hyundai has shown off a small model of a car it says can activate robotic legs to walk at 3mph (5km/ ...

  10. 在 windows 开发 reactNative 的环境 搭建过程 react-native-android

    安装的东西挺多的, 从 jdk 到c++环境 到node , python, 各种模拟器 http://bbs.reactnative.cn/topic/10/%E5%9C%A8windows%E4% ...