JVM内存基本理解
声明:本文内容仅作为本人方便记忆和查看所用。
JVM有五块内存空间:
1、method area:用于存储已被加载的类信息、常量、静态变量、即时编译后的代码等数据。
注:在JDK8中,Method Area(方法区)即PermGen(永久代)已经废弃,取而代之的是Metaspace(元空间);Metaspace的性质与Method Area基本类似,他们的本质区别是Metaspace不在虚拟机中,而是使用本地内存,理论上取决于32位/64位系统可虚拟的内存大。
2、heap:一般存放对象实例。
3、native method stack:作用和VM stack类似。
4、program counter register:当前线程执行字节码文件行号指示器,是唯一没有OutOfMemoryError的区域。
5、vm stack:每个方法在执行的时候都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到结束对应着stacks中入栈到出栈的过程。
其中1和2为线程共享数据区,其他为线程隔离数据区。
虚拟机创建对象:
1、heap中内存规整,则使用bump the pointer(指针碰撞);一般这种方式下GC为Serial、Palnew等带有compact过程。
2、heap中内存不规整,则必须维护一张表记录哪些内存可用,在分配的时候找到一块足够大的内存,并且更新该表,这种方式称为free list(空闲列表);一般这种方式下GC为CMS这种基于Mark-Sweep。
heap是否规整取决于GC方式是否带compact功能。
修改指针线程安全问题解决:
1、对分配内存空间时做同步处理,实际上虚拟机采用CAS配上失败重试的方法保证更新操作的原子性。
2、把内存分配的操作按照线程划分的不同的空间中,即每个线程在heap中预先分配一小块内存,称为本地线程分配缓冲,内存分配完之后需要将该内存初始化为零值,然后虚拟机对对象进行必要的设置。
GC:
young generation(minor GC):大部分对象在创建之后很快就会变得不可达。包含eden和survivor区。
old generation(major GC or full GC):对象没有不可达,从新生代存活下来,被复制到老年代。
card table:用来表示老年代某一区域中的所有对象是否持有对新生代对象的引用。这样新生代在GC的时候不需要花大量时间扫描所有老年代对象来确定对象的引用关系。
GC方式:
Serial GC:单线程收集器;Serial old是针对老年代的收集器
Parnew GC:Serial 新生代的多线程实现
Parallel :采用复制算法的多线程新生代收集器,主要关注目标是吞吐量
Parallel old(Parallel Compacting GC (JDK1.6后)):使用多线程和标记整理算法的老年代收集器
Concurrent Mark & Sweep GC(CMS):应用广泛,以获取最短停顿时间为目的;以标记清除算法为基础,会产生大量的空间碎片;为解决这个问题,默认提供-XX:+UseCMSCompactAtFullCollection收集开关参数(默认开启),用于在full GC完开启内存碎片的整理过程;还提供另外一个参数-XX:CMSFullGCsBeforeCompaction用于设置执行多少次不压缩full GC后跟着来一次带压缩的(默认次数为0)
GC ROOTS:
虚拟机栈中的引用对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
Native的引用对象
GC 算法:
标记清除:问题是容易产生大量的空间碎片,提前触发full GC
标记整理:老年代算法;先标记,再压缩,后清除
复制算法:新生代算法
增量算法:垃圾收集线程和应用程序线程交替运行;优点:减少系统停顿时间;缺点:因为线程切换和上下文转换的消耗,使得垃圾回收总成本上升,造成系统吞吐量下降。
JVM内存基本理解的更多相关文章
- JVM内存简单理解
1.首先简单说一下CPU与内存之间的关系 CPU运转速度快,磁盘的读写速度远远不及CPU运转速度,所以设计了内存来缓冲CPU等待磁盘读写:随着CPU的发展,内存读写也远远跟不上CPU的读写速度,CPU ...
- JVM 内存机制理解【转自http://www.cnblogs.com/dingyingsi/p/3760447.html】
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...
- 走进JVM【二】理解JVM内存区域
引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...
- 深入理解JVM(一)——JVM内存模型
JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. ...
- 你应该这样理解JVM内存管理
在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...
- 深入理解JVM内存区域与内存分配
前言:这是一篇关于JVM内存区域的文章,由网上一些有关这方面的文章和<深入理解Java虚拟机>整理而来,所以会有些类同的地方,也不能保证我自己写的比其他网上的和书本上的要好,也不可能会这样 ...
- 如何从编程的本质理解JVM内存模型
如何从编程的本质理解JVM内存模型 一般聊JVM内存模型都是把图截出来,然后对着图,解释上面堆.栈之类的概念.这篇将分享下,如何从编程的本质上理解,JVM内存模型是什么样子,为什么是这个样子,不再死记 ...
- 深入理解JVM之JVM内存区域与内存分配
深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处 ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
随机推荐
- C++内联函数作用及弊端
为什么要使用内联函数? 因为函数调用时候需要创建时间.参数传入传递等操作,造成了时间和空间的额外开销.C++追求效率所以引入了内联的概念. 通过编译器预处理,在调用内联函数的地方将内联函数内的语句Co ...
- jquery 第一节 什么是jQuery
简单来说,jQuery就是javascript的一个框架,也可以说是javascript的一个库.
- 使用itop4412开发板单独编译驱动模块
上面我们的驱动是放在了内核源码的目录下来实现的编译成驱动模块,很多时候我们都是拿到一个驱动源码,不需要把他放到内核源码里面,而是直接把他编译成驱动模块,下面我们来讲下实现方法,我们还是以蜂鸣器的驱动为 ...
- 3.redis认证
redis认证方法 1.redis.conf requirepass PASSWORD 2.redis-cli auth PASSWORD redis清空数据库 flushdb //清空当前数据库 f ...
- ZJNU 1069 - 表达式的转换——中级
栈运用的模板题,对于符号进行出入栈操作,每次与栈顶的符号进行优先级判断,得出第一行后缀表达式. 在其后的化简计算中,每次用一个特殊符号(代码中使用了'?')代替原来的计算结果引用,并开一个数组表示每次 ...
- JavaSE--jdom解析之bom
参考:http://www.cnblogs.com/findumars/p/3620078.html org.jdom2.input.JDOMParseException: Error on line ...
- 利用GetCharWidth32获取字符串宽度2
/////////////////////////////////////////////////////////////// // 04FirstWindow.cpp文件 #include < ...
- GPS坐标与百度坐标转换
百度对外接口的坐标系,都是经过国家测绘局加密处理,符合国家测绘局对地理信息保密要求. 国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ- 02,对地理位置进行首次加密.百度坐标在此 ...
- iOS个人中心渐变动画、微信对话框、标签选择器、自定义导航栏、短信验证输入框等源码
iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 程序员取悦女票的正确姿势---Tip1(iOS美容篇) iOS 前台重启应用和清除角标的问题 微信原生提醒对话框3.0 JHLikeBu ...
- 吴裕雄--天生自然 PYTHON3开发学习:JSON 数据解析
import json # Python 字典类型转换为 JSON 对象 data = { 'no' : 1, 'name' : 'Runoob', 'url' : 'http://www.runoo ...