Java Virtual Machine Garbage Collection浅析
2019独角兽企业重金招聘Python工程师标准>>>
在软件开发过程中,Java开发者往往不用关心JVM内存的申请和回收,因为JVM会统一管理对像内存空间的申请和回收。而c/c++开发中,开发者可以自已去管理内存.这中间有管理好的,有管理不好的。比如一个新手写的基于C/C++的server上线后,可能因为内存分配问题,经常宕机,而一个基于Java的Server上线后,也会碰到反应慢,打不开,OutOfMemory等情况。
虽然JVM GC会统一管理对象的回收,但它也不是无所不能的,它需要大家去了解它,帮助它更好地管理我们server端的内存。
系统在运行的过程中会不断产生新的对象,这些新的对象会占用一定的内存空间。内存空间是有限的,但对象会不断的产生,所以JVM会定期去清理那些被废弃的对象(通过根搜索算法,GCRoot无法达到的对象)。这时候就会产生几个问题:
定期:什么时间? a.并发,一边工作,一边清理 b.暂停所有工作,清理废弃对象。
从最早期的JVM垃圾回收机制来看,JVM并没有采取a方式,而是采用了b方式。最早期的Serial垃圾回收器的工作方式是"Stop the World". 为什么JVM没有采用a方式呢?暂不讨论。 "Stop the world"就意味着JVM需要停下手中的工作,来整理一下内存空间。这个时候Server就有了一个停顿时间,如果一个Server运行了100s,GC一次用了2s,那么它的吞吐量可以看成98%。
下面展示了GC所占时间,系统吞吐量带来的影响。
是不是GC所占时间越短,系统的吞吐量越高?right! 首先感谢那些默默为提高JVM GC效率作出杰出贡献者的大神们!
回忆一下,常见的垃圾回收算法:
废弃对象:简单来讲就是没有被GCRoot直接或间接引用到的对象。
标记清除: 标记废弃的对象,直接清除。 会造成内存碎片。
标记整理: 在标记清除算法的基础上,最后需要整理一下内存空间。消除碎片
分代复制:把空间分成几块,把有用的对象copy到另一块,然后整块清除原来的那一块。频繁对象的复制,耗时。
只有这些是不够的,大神们又发现了部分对象在垃圾回收的过程中,它们的命很硬,每次都是走走过场。
下图中我们可以发现,大部分对象的生命都很短,很早就被废弃了。
最后大神们为每个对象加上一个年龄,每经历一次GC年龄就加1.超过一定的年龄的对象群众不需要频繁的去做GC. 这个时候就发现了两个群体。一个群体是生命比较短暂,另一个群体生命比较长。即年青代和老年代。
年青代每次GC存活的对象比较少,分代复制算法比较适合它们。因为它们需要复制很少。 老年代每次GC存活的对象比较多,比较适合标记整理算法。所以这个时候存在不同年代的垃圾收集器。但凡事无绝对的,还需要具体情况具体分析。
同时随着硬件的提高,大部分服务器已经是多CPU,这个时候就可以考虑使用基于并行的垃圾收集器。
Reference:
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
转载于:https://my.oschina.net/zookeeper/blog/183294
Java Virtual Machine Garbage Collection浅析相关推荐
- eclipse failed to create the java virtual machine 问题图文解析
eclipse failed to create the java virtual machine 解决方法: 1.问题现象 2.java虚拟机初始化失败!寻找eclipse解压路径 3.寻找ec ...
- ubuntu linux下解决“no java virtual machine was found after searching the following locations:”的方法
ubuntu linux下解决"no java virtual machine was found after searching the following locations:" ...
- Eclipse启动出现“Failed to create the Java Virtual Machine”错误
Failed to create the Java Virtual Machine的本质是JVM内存分配不足. 启动eclipse的时候,JVM会自动分配内存,常见的包括Java堆,新生代和永久代的内 ...
- Flash Builder4.6 无法启动,并且报 Failed to create the Java Virtual Machine (2—可能更好些)...
转自:http://blog.csdn.net/major_/article/details/7232886 Flash Builder 4.6 启动出错, Failed to create the ...
- java machine 报错_Eclipse启动时报错:No java virtual machine
第一次碰到这个问题,因为Eclipse是同学拷贝过来给我的. 错误提示如下: A java Runtime Environment (JRE) or Java Development Kit (JDK ...
- 错误:Failed to create the Java Virtual Machine
引用:http://apps.hi.baidu.com/share/detail/30819988 以前用的eclipse-jee因为在部署项目过程中总是出现bug被我删除.今天去eclipse官网又 ...
- Failed to create the Java Virtual Machine
以前用的eclipse-jee因为在部署项目过程中总是出现bug被我删除.今天去eclipse官网又下了一个Eclipse IDE For Java EE Developers. 版本是:eclips ...
- 查看进程状态信息命令 jps - (Java Virtual Machine Process Status Tool)
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...
- Java Virtual Machine Stacks(虚拟机栈)
经过上面的分析,类加载机制的装载过程已经完成,后续的链接,初始化也会相应的生效. 假如目前的阶段是初始化完成了,后续做啥呢?肯定是Use使用咯,不用的话这样折腾来折腾去有什么意义?那怎样才能被使用到? ...
最新文章
- 李白打酒c语言编程,搞定了“李白打酒”,还原问题都迎刃而解
- RHEL6.3配置文件共享(5) Samba服务之三
- step1 . day7 C语言基础练习之指针和函数
- Linux静态库和动态库学习总结
- android各个版本的名称和更新(转)
- mysql必须安装在c盘吗_家用冷热水管保温棉必须装吗?水管保温棉选购及安装攻略分享...
- AngularJS-Hello World
- JS中的基本数据类型与引用数据类型
- Unable to add window -- token android.os.BinderProxy---Android原生开发工作笔记142
- 软件度量五步法包括_软件交付效能度量——从吞吐量和稳定性开始
- Linux c modbus 线程,Modbus TCP Slave Thread - 设置和获取寄存器值
- 【蓝桥杯单片机组模块】13、NEC 红外通信 - vs1838B
- 汇总一下那几个常用定理 高斯定理 泊松方程 亚阈值电流 跨导
- 程序员不能错过的20个学习网站
- 最优化方法(学习笔记)-第二章凸集
- 2021年南京大学软件工程专硕考研初试410分(数学满分)总成绩第二上岸经验贴
- Kong API Gateway 管理API详解
- no openvas scap database found. (tried /var/lib/openvas/scap-data/scap.db)错误
- 冯诺依曼结构计算机方案包含3个要点,冯诺依曼体系结构计算机的要点和工作过程.doc...
- java freemarker 导出富文本到Word文档
热门文章
- mysql虚拟列表_「前端进阶」高性能渲染十万条数据(虚拟列表)
- 海洋CMS仿RiPro主题风格自适应模板
- 0间隔24h采集线报+源码的资源网
- 源商城系统V1.0仿卡盟
- EduSoHo精品在线教育点播系统网站源码
- Web开发人员应当知道的15个开源项目
- Linux Shell脚本入门教程系列之(十三)Shell分支语句case … esac教程
- js如何判断是否在iframe中及防止网页被别站用 iframe嵌套 (Load denied by X-Frame-Options)...
- PHP 判断用户语言跳转网页
- 数学建模1(历年问题与模型)