`
和你在一起
  • 浏览: 681636 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM调优总结(四)-垃圾回收面临的问题

阅读更多

如何区分垃圾

 

    上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。

    同时,除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。

因此,垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器...)。而最简单的Java栈就是Java程序执行的main函数。这种回收方式,也是上面提到的“标记-清除”的回收方式

 

 

如何处理碎片

   由于不同Java对象存活时间是不一定的,因此,在程序运行一段时间以后,如果不进行内存整理,就会出现零散的内存碎片。碎片最直接的问题就是会导致无法分配大块的内存空间,以及程序运行效率降低。所以,在上面提到的基本垃圾回收算法中,“复制”方式和“标记-整理”方式,都可以解决碎片的问题。

 

 

如何解决同时存在的对象创建和对象回收问题

    垃圾回收线程是回收内存的,而程序运行线程则是消耗(或分配)内存的,一个回收内存,一个分配内存,从这点看,两者是矛盾的。因此,在现有的垃圾回收方式中,要进行垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用。这种实现方式是最直接,而且最有效的解决二者矛盾的方式。

但是这种方式有一个很明显的弊端,就是当堆空间持续增大时,垃圾回收的时间也将会相应的持续增大,对应应用暂停的时间也会相应的增大。一些对相应时间要求很高的应用,比如最大暂停时间要求是几百毫秒,那么当堆空间大于几个G时,就很有可能超过这个限制,在这种情况下,垃圾回收将会成为系统运行的一个瓶颈。为解决这种矛盾,有了并发垃圾回收算法,使用这种算法,垃圾回收线程与程序运行线程同时运行。在这种方式下,解决了暂停的问题,但是因为需要在新生成对象的同时又要回收对象,算法复杂性会大大增加,系统的处理能力也会相应降低,同时,“碎片”问题将会比较难解决。

30
2
分享到:
评论
7 楼 xuhang1128 2011-04-05  
root set的结构我还是有点疑问,也没有找到最完整的解释,不知道哪里可以找到
6 楼 wgh-23 2009-12-06  
我就保存了,呵呵……谢谢楼主!
5 楼 和你在一起 2009-11-24  
@hxy-go
谢谢~
这块我没有再深入的研究过。个人是这么理解的,root objects(也就是ZangXT说的root set)由stack、static field....等组成,在垃圾回收的时候,root objects就是起点,然后, 上面提到的那个C stack记录了所有的这些root objects。
4 楼 hxy-go 2009-11-24  
关于root objects,IBM的诊断手册上是这样说的
The first stage of tracing is the identification of root objects. The active state of the JVM is made up of the saved registers for each thread, the set of stacks that represent the threads, the statics that are in Java classes, and the set of local and global JNI references. All functions that are invoked in the JVM itself cause a frame on the C stack. This frame might contain references to objects as a result of either an assignment to a local variable, or a parameter that is sent from the caller. All these references are treated equally by the tracing routines.
因此楼主说根对象扫描从线程的栈开始是有根据的,而ZangXT 说的root set,我很了解下root set结构及存放地方,JVM是怎么维护root set的
3 楼 和你在一起 2009-11-24  
@ZangXT
谢谢!这里确实有点问题,已改正!
2 楼 ZangXT 2009-11-24  
垃圾回收的起点是root set,而不是栈。root set里面再包含栈引用,static信息等等。
所以说“垃圾回收的起点是stack”不是很合适。
1 楼 Heis 2009-11-23  
图文并茂的讲解,作入门学习和面试题来读还是挺不错的。

相关推荐

    JVM调优总结.pdf

    垃圾回收面临的问题包括处理速度、暂停时间和内存碎片等问题。 在典型配置举例部分,文档提供了实例来说明如何设置JVM参数来优化垃圾回收和内存分配。此外,文档还提到了新一代垃圾回收算法,例如G1垃圾回收器,它...

    深入虚拟机---JVM调优总结(摘自网上网上大牛分享).pdf

    JVM调优的目的是为了提升应用程序的性能,减少垃圾回收(GC)对程序运行的影响,优化内存的使用。在JVM调优中,垃圾回收的算法和策略是非常关键的部分。基本的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法...

    个人总结之—JVM性能调优实战

    本总结旨在分享作者在实践中不断探索与总结的经验,为读者提供一份全面而实用的JVM调优指南。 #### 关键知识点 ##### 1. JVM基础知识 - **JVM结构与工作原理**:了解JVM的基本组成及其工作流程对于进行有效的性能...

    第04章 大促高并发系统下JVM如何调优指导01.pdf

    总结起来,高并发系统下的JVM调优涉及对内存管理的深入理解、性能监控工具的运用、垃圾回收机制的掌握以及JVM参数的精细调整。架构师需要不断学习和实践,才能在系统架构设计中有效地运用这些知识,确保系统在大促...

    Everything I ever learned in JVM tuning in Twitter

    内存调优是JVM调优的核心部分之一,主要包括内存占用率(footprint)调优、分配速率(allocation rate)调优以及垃圾回收(garbage collection)调优。 **内存占用率调优:** 当出现`OutOfMemoryError`时,可能是...

    Qcon2011杭州-莫枢(RednaxelaFX)演讲-JVM@Taobao

    总结来说,莫枢在Qcon2011杭州的演讲揭示了淘宝在JVM优化上的深度实践,包括但不限于内存管理、类加载、垃圾回收、性能监控等方面。这些经验对于任何使用Java技术栈的大型企业来说都具有极高的参考价值,提醒我们...

    JVM优化经验总结Java开发Java经验技巧共15页.p

    优化JVM可以减少程序的启动时间,提高响应速度,减少内存消耗,以及避免因垃圾回收引起的暂停时间过长等问题。 以下是一些可能涵盖在文档中的JVM优化关键知识点: 1. **内存管理**:包括堆内存(新生代、老年代、...

    weblogic 调优

    - 调整JVM的垃圾回收策略,例如通过`-verbose:gc`参数开启垃圾回收的日志记录。 - 分析GC日志,根据应用的特点调整垃圾回收策略。 - 使用工具如VisualVM来分析GC日志,以便更好地理解垃圾回收的行为。 #### 四、...

    golang 50k 高阶面试题

    在了解这些垃圾回收器的基础上,面试者还应当掌握垃圾回收中的性能调优、内存分配策略、以及如何监控垃圾回收的性能指标等。 这些知识点不仅对于通过面试至关重要,对于理解Go语言在实际开发中所面临的内存管理问题...

    Tomcat并发数优化的方法总结.pdf

    - `-XX:+UseParallelGC`或`-XX:+UseG1GC`: 根据系统资源和应用特点选择合适的垃圾回收策略。 以上JVM参数需要根据服务器硬件资源和应用特性进行合理设置。 4. **负载均衡和集群** 对于大型企业级应用,仅靠...

    20届同学大厂社招面经(字节阿里虾皮滴滴offer).docx

    - **调优策略**:监控内存使用情况、调整垃圾回收策略、减少内存碎片等。 - **工具与技术**:使用JConsole、VisualVM等工具进行性能分析。 **知识点十二:MySQL事务隔离级别** - **隔离级别种类**:读未提交、读已...

    公司内部培训的高性能应用设计与开发技术(绝版)

    - JVM中的引用类型包括强引用、软引用、弱引用和虚引用,其中软引用可以帮助加速垃圾回收过程。 - **GC分代回收机制**: - 堆被分为Young(年轻代)、Tenured(年老代)和Perm(持久代)。 - 不同类型的垃圾收集...

    websphere 调优报告

    进一步检查WebSphere的`native_stderr.log`文件,我们发现内存溢出的原因在于Java堆内存被Java对象完全占用,且垃圾回收(Garbage Collection,简称GC)机制无法有效清理,导致新内存空间的分配失败。 ##### Java...

    java常见面试题java常见面试题

    - JVM调优涉及堆大小设置、垃圾回收策略调整、方法区配置等,目标是提升应用性能并减少停顿时间。 12. **Java 8及以后的新特性** - Lambda表达式:简化匿名函数的编写。 - Stream API:提供一种新的数据处理方式...

    2.HDFS 调优篇.pdf

    5. **垃圾回收(GC)优化**:调整JVM的垃圾回收参数,减少GC停顿时间。 总的来说,HDFS的容错机制保证了系统的稳定运行,而有效的调优策略则能进一步提升其性能和效率。在大数据环境中,理解并掌握这些知识点对于...

    Weblogic性能调优[归纳].pdf

    同时需要注意,过大的堆内存会导致更长的垃圾回收时间,从而影响性能。 #### 三、本地I/O与TCP连接调整 **1. Accept Backlog** - **定义**:Accept Backlog属性指定了服务器向操作系统请求的连接队列的大小。 - *...

Global site tag (gtag.js) - Google Analytics