为什么一些程序频繁发生GC? 一般有如下原因:
> 程序内调用了System.gc()或Runtime.gc()。
> 一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
> Java的Heap太小,一般默认的Heap值都很小。
> 频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。
经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3[2]。
2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成[2]。
注意:
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
Stack的设定:
每个线程都有他自己的Stack。
Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
3.硬件环境
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]。
4.4种GC
第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。
第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC
分享到:
相关推荐
4. **事件时间线**:GCViewer提供了一个时间线视图,显示了所有GC事件的发生顺序,帮助开发者理解GC活动与应用程序性能之间的关系。 5. **统计信息**:除了图形化展示,GCViewer还提供了详细的统计信息,如平均、...
3. **优化分配策略**:如果发现大量小对象频繁分配导致GC压力增大,可以考虑使用池或者批量分配策略来减少GC负担。 总的来说,`Go-gcvis`是Go开发者进行性能调优和内存管理的强大辅助工具,它以直观的可视化方式...
此外,VisualGC还能展示线程堆栈,帮助我们了解在GC发生时应用程序的运行状态,找出可能造成阻塞的线程。这对于诊断并发问题和死锁非常有帮助。 在实际使用中,我们需要将VisualVM与我们的Java应用连接起来,可以...
对于某些动态加载类的应用程序来说,适当增大持久代可以避免频繁的Full GC。 #### 四、GC类型及其触发条件 1. **Scavenge GC**:主要针对年轻代进行的局部GC操作,当Eden区空间不足时触发,目的是清理不再使用的...
2. **性能问题**:频繁的年轻代GC可能导致应用暂停时间过长,影响服务响应速度。如果年轻代设置过小,这种情况尤为常见。 3. **错误的垃圾收集器配置**:JVM提供了多种GC策略,如Serial、Parallel、Parallel Old、...
- **频繁的GC**:过多的垃圾收集可能导致应用程序性能下降,应检查代码中的内存使用模式,减少不必要的对象创建。 - **过长的暂停时间**:如果GC暂停时间过长,可能需要调整GC策略或增加内存分配,以减少Full GC的...
- 当GC发生时,Eden中的存活对象被移入Survivor空间之一。 - 对象在Survivor空间之间移动,直至它们“老化”,随后被移入旧生代。 - **Minor Collection(小收集)**: - 当Eden区满时,触发小收集,执行时间取决...
通过这个工具,开发者可以获取到关于GC运行的详细统计数据,从而优化应用程序的性能。 `gchisto` 提供了以下关键指标: 1. **总GC次数**:这是自应用程序启动以来JVM执行的所有GC操作的总数。包括年轻代(Young GC...
1. **年轻代(Young Generation)GC**:这是JVM中最频繁发生的GC,主要处理短时间内创建和消亡的对象。 2. **老年代(Tenured Generation)GC**:对于存活时间较长的对象,会被晋升到老年代,这里的GC相对较慢,可能...
1. ** Minor GC**:主要针对年轻代(Young Generation)的垃圾收集,通常速度较快,但频繁发生。 2. ** Major GC / Full GC**:涉及老年代(Tenured Generation)的垃圾收集,可能涉及到整个堆,速度较慢,应尽量...
在给出的日志片段中,我们看到了两个关键的时间戳,33.125和100.667,这两个数字表示从JVM启动到发生GC事件的时间(以秒为单位)。这可以帮助我们理解程序运行期间GC活动的频率。 `[gc]` 和 `[full gc]` 分别标识了...
这有助于平衡内存管理和应用程序性能之间的关系,避免频繁的GC操作影响程序执行效率。 4. **多样的回收策略**:不同版本的JVM提供了多种GC算法,包括但不限于串行收集器、并行收集器、并发标记扫描收集器以及G1收集...
1. 适当增大堆内存:增加堆大小可以减少Full GC的发生频率。 2. 调整新生代与老年代的比例:通过-Xmn、-XX:NewRatio等参数调整,减少新生代晋升到老年代的对象数量。 3. 使用更高效的垃圾收集器:例如,G1、ZGC、...
GC主要发生在堆中,通常会将堆细分为多个子区域,以便更高效地进行垃圾回收。 - **方法区域**: Hotspot JVM中的永久代(Permanent Generation),存放每个Class的结构信息,如常量池、字段描述、方法描述等。 #### ...
7. **对象生命周期管理**:优化对象的创建和销毁,避免短生命周期对象进入老年代,减少Full GC的发生。 8. **大对象处理**:大对象直接进入老年代,避免频繁在新生代和老年代之间移动。可通过`-XX:...
新生代中的垃圾回收被称为Minor GC(小垃圾收集),发生频繁,主要负责回收那些生命周期短的对象。当新生代空间满时,Minor GC会被触发,这个过程会停止所有应用程序线程(Stop-the-World事件)。Minor GC优化的假设...
- 避免频繁的Full GC可以提高系统响应速度,可以通过合理设置堆大小、使用大对象直接进入老年代、使用CMS或G1等并发收集器来减少Full GC的发生。 8. **内存分配策略** - 对象尽量分配在Eden区,减少跨代引用,有...
为了理解垃圾收集为什么会暂停JVM,首先需要了解Java中垃圾收集的工作原理。 Java虚拟机提供了多种垃圾收集算法,不同的JVM实现可能会使用不同的垃圾收集策略。理解这些垃圾收集策略对于优化垃圾收集行为,减少应用...
Java GC的主要目标是识别并清理不再被程序引用的对象,以便有效地利用内存资源。它分为多个阶段,包括标记、扫描、整理等,以确保内存的高效利用。监控GC可以帮助我们理解应用的内存行为,识别潜在的问题,并优化...
Java的垃圾收集器(Garbage Collector,简称GC)是Java平台的一个重要特性,它负责自动管理程序中的内存,避免手动内存管理可能导致的内存泄漏问题。Java的垃圾收集机制是基于引用计数和可达性分析算法的,其目标是...