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堆.如下 ...
随机推荐
- 报错:ORA-02287: 此处不允许序号
CREATE TABLE MY_TAB (N1 NUMBER(5),N2 DATE); SELECT * FROM MY_TAB; CREATE SEQUENCE ...
- Eclipse怎么忽略掉报错的js文件
第一步,我们要先定位错误在哪里,选择菜单里window——show view——other,选择Problems. 第二步,点击有红叉的项目,在Problems视图中,可以看到是什么错,哪个文件夹中的 ...
- windows 7下安装python+mongodb
1. python安装 下载:http://python.org/download/ 直接双击安装,安装完后将路径加入系统环境变量path中. 2. mongodb安装 下载:http://www.m ...
- archlinux的安装与简单配置(长期更新)
安装部分较为较为简略,详细内容请查看arch的wiki 分区 cfdisk 格式化 mkfs.ext4 /dev/sdaX ... 挂载分区 mount /dev/sdaX /mnt ... 修改软件 ...
- ftp文件操作
PHP FTP操作类( 上传.拷贝.移动.删除文件/创建目录 ) 2016-06-01 PHP编程 /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ ...
- echarts的使用
ECharts是一个图形展示控件,基于javascript开发出来的,挺好用的,研究了下. 主页地址:http://echarts.baidu.com/index.html API地址:http:// ...
- asp.net Server.HtmlEncode和HtmlDecode
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">< ...
- 【行为型】Visitor模式
访问者模式意图在不改变目标对象类结构的情况下,扩展对象类的行为.新扩展的行为均被封装成类对象的形式来动作.应用该模式时,往往目标类系与Visitor类系是两个不同的类系,它们配合工作但维护是分开的,互 ...
- postgres常用操作
1. 创建一张表主键自增 create table region( id serial PRIMARY KEY, name ), value ); #会自动创建 region_seq_id表,drop ...
- UIAlertView的使用方法
UIAlertView的使用方法 1. 最简单的用法 UIAlertView*alert = [[UIAlertView alloc]initWithTitle:@"提示" mes ...