- 浏览: 806718 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
huan19900606:
像haskell这些脚本语言很容易定义DSL,实现对应的词法语 ...
DSL的基本介绍(groovy来进行构建) -
express_wind:
https://yq.aliyun.com/album/130 ...
qlexpress规则引擎初探 -
readxuxuegang:
博主你好。如果groovy的代码是保存在数据库里,不是文件,这 ...
在java中使用groovy怎么搞 (java and groovy) -
express_wind:
hi,兄弟,有没有兴趣来阿里巴巴专门做这方面的研究,https ...
qlexpress规则引擎初探 -
langcaiye:
有2个问题请教:1. 这里的base32算法为什么需要以负数的 ...
【原】geohash算法详解
最近线上出现一个故障,因为是JVM配置参数问题,导致的gc有问题,从而导致JVM挂起,以至于不能提供服务,现在把JVM默认的gc方式以及在日志中的体现汇总一下。
关于server模式和client模式:
JVM如果不指定-server或-client选项,JVM会在启动的时候根据硬件环境判断以server模式启动还是以client模式启动(适用于Java 5及以上版本)。
JVM工作在server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以server模式启动,否则以client模式启动,Java 5检测的根据是至少2个CPU和最低2GB内存。
JVM工作在server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以server模式启动,否则以client模式启动,Java 5检测的根据是至少2个CPU和最低2GB内存。
当JVM用于启动GUI界面的交互应用时适合于使用client模式,当JVM用于运行服务器后台程序时建议用server模式。
Young区GC的方式:
1、 串行GC(Serial Copying)
client模式下的默认GC方式,也可使用-XX:+UseSerialGC指定。
2、 并行回收GC(Parallel Scavenge)
server模式下的默认GC方式,也可用-XX:+UseParallelGC强制指定。
采用PS时,默认情况下JVM会在运行时动态调整Eden:S0:S1的比例,如果不希望自动调整可以使用-XX:-UseAdaptiveSizePolicy参数,内存分配和回收的算法和串行相同,唯一不同仅在于回收时为多线程。
3、 并行GC(ParNew)
CMS GC时默认采用,也可以采用-XX:+UseParNewGC指定。
内存分配、回收和PS相同,不同的仅在于会收拾会配合CMS做些处理。
Old区GC的方式:
1、 串行GC(Serial MSC)
client模式下的默认GC方式,可通过-XX:+UseSerialGC强制指定。每次进行全部回收,进行Compact,非常耗费时间。
client模式下的默认GC方式,可通过-XX:+UseSerialGC强制指定。每次进行全部回收,进行Compact,非常耗费时间。
2、 并行GC(Parallel MSC)
server模式下的默认GC方式,也可用-XX:+UseParallelGC=强制指定。可以在选项后加等号来制定并行的线程数。
3、 并发GC(CMS)线上环境采用的GC方式,也就是Realese环境的方式
使用CMS是为了减少GC执行时的停顿时间,垃圾回收线程和应用线程同时执行,可以使用-XX:+UseConcMarkSweepGC=指定使用,后边接等号指定并发线程数。CMS每次回收只停顿很短的时间,分别在开始的时候(Initial Marking),和中间(Final Marking)的时候,第二次时间略长。具体CMS的过程可以参考相关文档。
JStat中将Initial Mark和Remark都统计成了FGC。
CMS一个比较大的问题是碎片和浮动垃圾问题(Floating Gabage)。碎片是由于CMS默认不对内存进行Compact所致,可以通过-XX:+UseCMSCompactAtFullCollection。
CMS一个比较大的问题是碎片和浮动垃圾问题(Floating Gabage)。碎片是由于CMS默认不对内存进行Compact所致,可以通过-XX:+UseCMSCompactAtFullCollection。
组合方式:
默认的情况
启动模式 | 新生代GC方式 | 旧生代和持久带GC方式 |
client | 串行 | 串行 |
server | 并行回收GC | 并发GC |
一条日志解析:
(1)young区并行GC的一条日志
2012-03-16T00:40:45.298+0800: 2643.312:----日志打印时间
[GC 2643.312:
[ParNew:1775248K->10302K(1922432K), 0.0101690 secs] ----新生代使用空间为1775248K,回收后为10302K,分配的内存区域1922432K,消耗的时间
1975044K->210184K(4019584K), 0.0104000 secs]-----整个heap区域的情况
[Times: user=0.02 sys=0.00, real=0.00 secs] -----Young GC期间的性能消耗
[GC 2643.312:
[ParNew:1775248K->10302K(1922432K), 0.0101690 secs] ----新生代使用空间为1775248K,回收后为10302K,分配的内存区域1922432K,消耗的时间
1975044K->210184K(4019584K), 0.0104000 secs]-----整个heap区域的情况
[Times: user=0.02 sys=0.00, real=0.00 secs] -----Young GC期间的性能消耗
(2)由于CMS GC执行时分为多步,所以输出的日志也较多
2012-03-16T18:29:20.007+0800: 66966.285: [GC [1 CMS-initial-mark: 1677742K(2097152K)] 1760380K(4019584K), 0.0566720 secs]
[Times: user=0.05 sys=0.00, real=0.06 secs] 进行initial Marking步骤,旧生带的大小为2097152K,在被占用1677742K后出发GC,还是0.06sccs
2012-03-16T18:29:20.064+0800: 66966.342: [CMS-concurrent-mark-start]
2012-03-16T18:29:23.307+0800: 66969.586: [CMS-concurrent-mark: 3.243/3.243 secs] [Times: user=7.05 sys=0.07, real=3.24 secs]
2012-03-16T18:29:23.307+0800: 66969.586: [CMS-concurrent-preclean-start]
2012-03-16T18:29:23.331+0800: 66969.609: [CMS-concurrent-preclean: 0.020/0.023 secs] [Times: user=0.00 sys=0.01, real=0.02 secs]
2012-03-16T18:29:23.331+0800: 66969.609: [CMS-concurrent-abortable-preclean-start]
CMS: abort preclean due to time 2012-03-16T18:29:28.437+0800: 66974.716: [CMS-concurrent-abortable-preclean: 5.071/5.106 secs] [Tim
es: user=5.87 sys=0.18, real=5.12 secs]
2012-03-16T18:29:28.439+0800: 66974.717: [GC[YG occupancy: 442888 K (1922432 K)]66974.718: [Rescan (parallel) , 0.2664000 secs]66974
.984: [weak refs processing, 0.0188380 secs]66975.003: [class unloading, 0.0251650 secs]66975.028: [scrub symbol & string tables, 0.
0171980 secs] [1 CMS-remark: 1677742K(2097152K)] 2120631K(4019584K), 0.3318590 secs] [Times: user=0.81 sys=0.00, real=0.32 secs]
2012-03-16T18:29:28.773+0800: 66975.052: [CMS-concurrent-sweep-start]
2012-03-16T18:29:31.780+0800: 66978.059: [CMS-concurrent-sweep: 2.943/3.007 secs] [Times: user=3.42 sys=0.13, real=3.01 secs]
2012-03-16T18:29:31.780+0800: 66978.059: [CMS-concurrent-reset-start]
2012-03-16T18:29:31.786+0800: 66978.065: [CMS-concurrent-reset: 0.005/0.005 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
重新初始化CMS的相关数据,为下次CMS GC做准备
[Times: user=0.05 sys=0.00, real=0.06 secs] 进行initial Marking步骤,旧生带的大小为2097152K,在被占用1677742K后出发GC,还是0.06sccs
2012-03-16T18:29:20.064+0800: 66966.342: [CMS-concurrent-mark-start]
2012-03-16T18:29:23.307+0800: 66969.586: [CMS-concurrent-mark: 3.243/3.243 secs] [Times: user=7.05 sys=0.07, real=3.24 secs]
2012-03-16T18:29:23.307+0800: 66969.586: [CMS-concurrent-preclean-start]
2012-03-16T18:29:23.331+0800: 66969.609: [CMS-concurrent-preclean: 0.020/0.023 secs] [Times: user=0.00 sys=0.01, real=0.02 secs]
2012-03-16T18:29:23.331+0800: 66969.609: [CMS-concurrent-abortable-preclean-start]
CMS: abort preclean due to time 2012-03-16T18:29:28.437+0800: 66974.716: [CMS-concurrent-abortable-preclean: 5.071/5.106 secs] [Tim
es: user=5.87 sys=0.18, real=5.12 secs]
2012-03-16T18:29:28.439+0800: 66974.717: [GC[YG occupancy: 442888 K (1922432 K)]66974.718: [Rescan (parallel) , 0.2664000 secs]66974
.984: [weak refs processing, 0.0188380 secs]66975.003: [class unloading, 0.0251650 secs]66975.028: [scrub symbol & string tables, 0.
0171980 secs] [1 CMS-remark: 1677742K(2097152K)] 2120631K(4019584K), 0.3318590 secs] [Times: user=0.81 sys=0.00, real=0.32 secs]
2012-03-16T18:29:28.773+0800: 66975.052: [CMS-concurrent-sweep-start]
2012-03-16T18:29:31.780+0800: 66978.059: [CMS-concurrent-sweep: 2.943/3.007 secs] [Times: user=3.42 sys=0.13, real=3.01 secs]
2012-03-16T18:29:31.780+0800: 66978.059: [CMS-concurrent-reset-start]
2012-03-16T18:29:31.786+0800: 66978.065: [CMS-concurrent-reset: 0.005/0.005 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
重新初始化CMS的相关数据,为下次CMS GC做准备
(3)当旧生带和持久带出发GC时,其实是对新生代、旧生带、以及持久带都进行GC,俗称Full GC
除了直接的System.gc()外,出发Full GC的情况还有如下四种
一、旧生代空间不足:java.lang.outOfMemoryError:java heap space
二、Perm空间满:java.lang.outOfMemoryError:PermGen space
三、CMS GC时出现promotion failed 和concurrent mode failure,
promotion failed是在Minor GC是,S区域放不下,而此时旧生带也放不下造成的;
concurrent mode failure是在CMS GC的时候,有对象放入旧生代,此时旧生代放不下导致的;
由于concurrent mode failure失败,由于CMS GC失败出发的Full GC
2012-03-01T12:01:06.062+0800: 53.487:
[Full GC 53.487:
[CMS2012-03-01T12:01:06.170+0800: 53.595: [CMS-concurrent-abortable-preclean:3.696/5.047 secs][Times: user=11.57 sys=1.46, real=5.04 secs]
(concurrent mode failure): 0K->107493K(2146304K), 1.0931670 secs] 926560K->107493K(4023680K),
[CMS Perm : 98303K->97840K(98304K)], 1.0939460 secs] [Times: user=0.83 sys=0.12, real=1.10 secs]
[Full GC 53.487:
[CMS2012-03-01T12:01:06.170+0800: 53.595: [CMS-concurrent-abortable-preclean:3.696/5.047 secs][Times: user=11.57 sys=1.46, real=5.04 secs]
(concurrent mode failure): 0K->107493K(2146304K), 1.0931670 secs] 926560K->107493K(4023680K),
[CMS Perm : 98303K->97840K(98304K)], 1.0939460 secs] [Times: user=0.83 sys=0.12, real=1.10 secs]
四、统计得到的minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
--------------------------------------------------------------------------------------------------
内存区域的分配见下图
发表评论
-
系统分布式情况下最终一致性方案梳理
2015-09-05 19:34 40962前言 目前的应用系 ... -
Storm核心概念剖析
2015-03-20 20:42 3228最近团队中有分析的场 ... -
池和流的两种数据处理方式
2014-11-19 22:59 1396在抽象层面,想了一下,目前很多的数据处理形式,一般分为池和流 ... -
关于CodeReview(java)
2014-10-29 20:42 1908关于codereview,在平时的开发中,经常忽略的环节,参 ... -
java中各种各样的数据结构
2014-07-13 20:26 2469在java中,有非常丰富的数据结构,可能是因为大多数的软件 ... -
关于JVM的ClassLoader(笔记)
2014-07-13 12:19 1875众所周知,java是编译型的语言,写的是java文 ... -
关于事务的几个概念介绍
2014-06-06 22:22 1944啥是事务? 有一组操 ... -
开发中遇到的编码问题
2014-05-22 19:39 18841、说到编码,最大的问题就是乱码了,为啥会有乱码呢 ? 因 ... -
ThreadLocal源代码解析
2014-04-24 17:54 2408最开始的时候,理解的ThreadLocal,我的理解是这样的 ... -
关于单例模式(代码篇)
2014-04-23 10:47 2419很早的时候,转发过一篇单例模式的文章:http://iamz ... -
今天遇到的两个spring相关的两个问题
2014-04-18 21:56 2561今天在项目中写代码,遇到两个Spring的问题,记录一下。再 ... -
Activiti中的命令模式解析
2014-04-11 13:10 3199最近在看Activiti的源代码,发现是基于命令模式进行的开 ... -
关于java中的本地缓存-总结概述
2014-03-31 19:00 18374java中的本地缓存,工作后陆续用到,一直想写,一直无从下 ... -
使用guava中的EventBus构建内存级别的事件引擎
2014-03-25 19:27 6408这个EventBus是guava中比较给力的一个类,从字面 ... -
DSL的基本介绍(groovy来进行构建)
2014-03-04 23:32 17055什么是DSL? 领域特定 ... -
qlexpress规则引擎初探
2014-02-25 22:28 25122qlexpress是啥? 这个是阿里内部的一个开源的jav ... -
在java中使用groovy怎么搞 (java and groovy)
2014-01-15 23:17 10961什么是groovy? 一种基于Java虚拟机的动态语言, ... -
java中记录方法调用时间,结果按照方法的层级树状的输出
2013-12-21 17:36 4687 在java中,最常用的埋点时间的方法就 ... -
一次CMS GC问题排查过程(理解原理+读懂GC日志)
2013-12-14 22:21 41350这个是之前处理过的一个线上问题,处理过程断断续续,经历了两 ... -
令牌桶算法和漏桶算法以及流量控制浅谈
2013-11-27 23:20 20795 在双十一等大促环节,系统需要限流,外部 ...
相关推荐
2. **Setup.ini**:这是一个配置文件,通常包含安装过程中的设置和选项,例如默认安装路径、语言选择等。 3. **GC-Prevue.msi**:这是微软的Windows Installer包文件,用于在Windows系统上安装软件。通过msi文件,...
4、配置为在系统启动的时候加载gc2145.ko(SDK默认加载的是gc0308.ko) R:\wyb\gc2145_tinav2.1\target\allwinner\astar-common\modules.mk define KernelPackage/sunxi-vfe SUBMENU:=$(VIDEO_MENU) TITLE:=sunxi-...
- 数据库安全:讲解用户管理、角色权限、默认安全性策略和审计功能。 - 日志管理:探讨redo log文件和归档日志的使用,以及数据库恢复的基础。 - 性能监控:如何使用SQL*Plus、企业管理器或性能视图进行性能监控和...
当一块用完后,将存活对象复制到另一块,并清理原块。此算法避免了碎片,但浪费了一半内存。 3. 标记-整理算法:标记后,让所有存活对象向一端移动,然后直接清理边界外的内存。适合老年代对象,因为老年代对象一般...
Java 8之后,元空间替代了永久代,用于存储类的元数据,其默认大小不再受限,可以通过-XX:MetaspaceSize和-XX:MaxMetaSpaceSize进行调整。 栈则按线程分配,每个线程拥有自己的程序计数器、虚拟机栈和本地方法栈。...
- Serial GC:这是JVM的默认GC,适用于单线程环境,采用"Stop-The-World"策略,即在回收时暂停所有应用线程。 - Parallel GC:也称为吞吐量优先GC,多线程执行垃圾回收,提高了回收速度,但可能导致较长时间的暂停...
- **多线程并行GC(G1垃圾收集器)**:G1是一款面向服务端应用的垃圾收集器,它将堆内存划分为多个区域,并采用并行和并发的方式进行垃圾回收,提高了应用程序的响应速度。 - **类型推断(钻石操作符)**:在创建...
可以通过以下几种方式来优化: - 设置`-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps`来获取详细的垃圾回收信息。 - 调整垃圾回收策略,例如使用`-XX:+UseConcMarkSweepGC`或`-XX:+UseG1GC`等。 ### ...
5. **默认方法**:接口在JDK1.8中引入了默认方法,允许接口中定义带有实现的方法,这使得接口可以在不破坏现有实现的情况下扩展其功能。 6. **Optional类**:`Optional<T>`类是用来解决Java中的null安全问题,它...
#### 7.8 什么是GC停顿(GC pause)? - **定义**:GC停顿指的是垃圾回收过程中暂停应用程序执行的时间间隔。 #### 7.9 GC停顿与STW停顿有什么区别? - **GC停顿**:特指垃圾回收过程中的停顿。 - **STW停顿**:Stop ...
- **G1垃圾收集器默认启用**:G1 GC成为JVM的默认垃圾收集器,提供更好的内存管理和应用响应时间。 5. **JDK 11**: - **HTTP客户端升级**:增强了HTTP客户端API,支持更多的HTTP/2特性。 - **字符串转换为整数...
3. **监控GC行为**:通过设置JVM参数(如`-verbose:gc`, `-XX:+PrintGCDetails`, `-XX:+PrintGCTimeStamps`)来获取GC日志,分析GC频率、耗时以及暂停时间等信息,据此调整GC策略,优化内存使用效率。 #### 八、...
总的来说,"IOS应用源码——自定义action sheet效果库.zip"提供了一种增强iOS应用交互性的解决方案,它允许开发者超越默认的Action Sheet限制,创造更加个性化的用户体验。通过学习和使用这个库,开发者不仅可以提高...
10. **默认构造方法**:Java会为每个类提供默认的无参数构造方法,除非用户自己定义了构造方法,这时系统不再提供默认构造方法。 11. **建模与方法命名规范**:在Java中,推荐方法名的首字母小写,这与C#的习惯相反...
10. **CopyOnWriteArrayList**:这是一个线程安全的ArrayList实现,通过复制原数组到新数组并在新数组上进行修改来避免并发修改异常,适合读多写少的场景。 11. **GET与POST的区别**:GET将数据放在URL中,可见且有...
1. **配置PHP的session存储方式**:首先,你需要在PHP的配置文件(如php.ini)中更改session的默认存储处理器。将`session.save_handler = files`修改为`session.save_handler = user`,这使得PHP允许使用用户自定义...
垃圾回收GC是JVM自动管理内存的一部分,包括对象存活判断、垃圾收集算法、垃圾收集器和内存模型与回收策略。 1.2 static、final static关键字用于定义静态变量或静态方法,final用于定义常量或修饰方法、类,表示...
- `ArrayList`在添加元素时会根据需要扩展数组大小,默认增长率为原数组大小的1.5倍;而`Vector`默认增长率是原来的2倍。 - `Vector`的所有方法都是同步的,因此它是线程安全的,但这种同步也会影响性能。 - `...