Java虚拟机内存区域堆(heap)的管理
在上一节中Java 出现内存溢出的定位以及解决方案 中对于Java虚拟机栈以及方法区的内存出现的异常以及处理方式进行了解析,由于Java虚拟机对于堆的管理十分复杂,并且Java虚拟机中最基本的内存区域,所以单独提出一节进行分析。
先来解释一下对象存活??
什么样的对象是已经死了的对象,须要垃圾回收器进行回收。这个概念至关重要。由于它影响到垃圾回收器对于哪一个对象进行回收。能够从GCRoot訪问到的对象是存活的对象,那么以外的对象就是已死的对象。
GCRoot:包含四种 1)Java虚拟机栈中存放的reference指针指向的对象 2)本地方法栈中reference指向的对象 3)方法区中的常量引用对象 4)方法区中静态类属性引用的对象
GC 垃圾回收器
垃圾回收器採用的是标记-清除-整理算法回收内存。
Minor GC和Full GC。Minor GC是对年轻代回收的过程。 Full GC 是对整个堆以及方法区进行回收的过程。
分代收集。在Java虚拟机中对于堆的内存区域进行再划分为,Young Generation(年轻代)和Old Generation(老代)
年轻代用于存储年龄没有达到-XX:PretenureSizeThreshold的对象,老代用于存储年龄超过了-XX:PretenureSizeThreshold的对象。
然后对于年轻代再进行细分,Eden Space, From Space, ToSpace三个内存区域,这三个内存区域的大小由-XX:SurivorRadio来定义。在进行Minor GC的时候,会将Eden Space和From Space中存活的对象Copy到ToSpace中,并将超过春节龄的对象Copy到老代。当老代空间不足时,启动Full GC。
(上面概念仅仅是进行了简单的描写叙述,在JVM实际执行过程中要复杂的多,只是大概原理是这种)。
了解了上面基本概念之后,看以下的垃圾回收器就比較简单了。垃圾回收器总共分为七种:Serial收集器与Serial Old
收集器。Parallel Scavenge
收集器与Parallel Old,ParNew收集器,CMS收集器,G1(Garbage First)收集器。
1.Serial收集器与Serial Old
收集器。分别用于收集年轻代和老年代内存区域,Serial是单线程的垃圾收集器。在执行过程中须要暂停全部的Java线程。
2.ParNew收集器实际上就是Serial收集器的多线程版本号(针对于年轻代)。
3.Parallel Scavenge
收集器与Parallel Old: 是并行的多线程垃圾处理器,能够规定最大垃圾收集停顿时间-XX:MaxGCPauseMillis以及设置吞吐量大小-XX:GCTimeRadio.
4.CMS
收集器(Concurrent Mark Sweep): 是针对于老年代的多线程并发运行的垃圾回收器。以获取最短回收停顿时间为目标的收集器(主要用于B/S架构的server上)
5.
G1(Garbage First)收集器: 是最新的垃圾回收器,适合于(JDK1.6_update14)以上的JVM;G1将整个Java堆(包含新生代和老年代)划分为多个固定大小的独立区域,而且跟踪这些区域里面的垃圾堆积程度,在后台维护一个垃圾优先列表,每次依据同意收集的时间,优先回收垃圾最多的区域。
总之,要想获得最大吞吐量的服务类型就採用Parallel Scavenge 收集器与Parallel Old收集器组合。
要实现实时系统最好採用CMS 收集器(Concurrent Mark Sweep)。
只是client因为比較小,还是使用Serial比較好。
Java虚拟机内存区域堆(heap)的管理的更多相关文章
- 重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分
一.Java虚拟机内存区域如何划分 1.Java虚拟机内存区域的划分 区域名称 作用(用途) 类型 特点 虚拟机规定异常情况 内存分配与回收 其他说明 1 程序计数器 指示当前正在执行的字节码指令地址 ...
- 总结Java虚拟机内存区域模型
本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序 ...
- 一文解析总结Java虚拟机内存区域模型
最近抽空看了一点<深入理解Java虚拟机>,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下J ...
- java虚拟机内存区域理解
java虚拟机有的区域随着虚拟机进程的启动而存在, 有的区域依赖用户线程的启动和结束而建立和销毁. 程序计数器:为了线程切换后能恢复到正确的执行位置,每个线程都有一个独立的程序计数器.(针对java方 ...
- 【转】 Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令 ...
- java虚拟机内存区域的划分以及作用详解
序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...
- java虚拟机内存区域
java虚拟机运行时数据 程序计数器 是一块较小的内存空间,属于线程私有的内存. 用来记录正在执行的虚拟机字节码指令的地址. 每个线程都需要一个独立的程序计数器,各个线程间的计数器互不影响,独立存储. ...
- 【四】Java虚拟机内存区域初识
一.线程独占区 1.程序计数器 程序计数器是一块处于线程独占区较小的内存空间,它可以看是当前线程所执行的字节码的行号指示器. 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码 ...
- 一、java虚拟机内存区域
内存区域 java虚拟机在java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.java虚拟机规范将JVM管理的内存分为:程序计数器.本地方法栈.Java虚拟机栈.方法区.Java堆.如下 ...
随机推荐
- C# 、winform 添加皮肤后(IrisSkin2) label设置的颜色 无法显示
C# .winform 添加皮肤后(IrisSkin2) label设置的颜色 无法显示 解决方法一:设置label的Tag属性值与skinEngine的DisableTag属性值相同即可.默认值是9 ...
- 34.Spring-Aop.md
http://blog.csdn.net/bigtree_3721/article/details/50759843 目录 [toc] --- 1.概念 1.1概念 AOP是Spring提供的关键特性 ...
- underscorejs-pluck学习
2.14 pluck 2.14.1 语法: _.pluck(list, key) 2.14.2 说明: pluck方法根据key对list数组中的每个对象进行检索,返回检索成功的属性值,否则返回und ...
- How to Enable or Disable a cell in DataGridview Row ?
Following link http://msdn.microsoft.com/en-us/library/ms171619.aspxhttp://windowsclient.net/blogs/f ...
- CSS3圆角详解
一.CSS3圆角的优点 传统的圆角生成方案,必须使用多张图片作为背景图案.CSS3的出现,使得我们再也不必浪费时间去制作这些图片了,而且还有其他多个优点: * 减少维护的工作量.图片文件的生成.更新. ...
- TCP\UDP链接的异同
简单的说TCP与UDP的区别是有无连接状态.TCP是有连接状态的,而UDP没有,所以TCP是一种比较安全的通讯协议,而UDP则比较方便 TCP 127.0.0.1:1026 0.0.0.0:0 LIS ...
- Python3.4+opencv3
1.安装Python 3.4 for Windows 好的这好像没有什么可以说的 2.下载OpenCV 3和Numpy(OpenCV依赖Numpy库) 大家在这里就出了问题.如果使用直接使用pip i ...
- bzoj4171 or 省队集训day3 chess: Rhl的游戏
[题目描述] RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色.每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少 ...
- oracle中字符串的大小比较,字符串与数字的比较和运算
Oracle比较字符串是根据ASCII码来的,第一个字母的ASCII大小比较如果相等再比较下一个,类推.字符串和数字进行操作是会报异常的,因为类型不一样不能进行比较. Oracle在执行SQL的时候有 ...
- (未解决)问题记录ionic android 签名之后安装到手机上点击运行出现闪退,不签名运行正常
Log日志如下: - ::): error opening trace ) - ::): FATAL EXCEPTION: main - ::): java.lang.RuntimeException ...