`

System.gc()分析

    博客分类:
  • jvm
阅读更多
     public static void gc() {
        Runtime.getRuntime().gc();
     }

      if (!DisableExplicitGC) { //如果可以直接进行垃圾回收,则执行下面的一步, -XX:+DisableExplicitGC 选项可以关闭jvm的直接垃圾回收

                     Universe::heap()->collect(GCCause::_java_lang_system_gc);
              }

     }


  void ParallelScavengeHeap::collect(GCCause::Cause cause) {

             ...........

             VM_ParallelGCSystemGC op(gc_count, full_gc_count, cause);
             VMThread::execute(&op);

     }

     void VM_ParallelGCSystemGC::doit() {

             //在这主要看一下全部回收的代码

             ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();

             heap->invoke_full_gc(false);

     }

   inline void ParallelScavengeHeap::invoke_full_gc(bool maximum_compaction)
    {

             .......
             PSMarkSweep::invoke(maximum_compaction);//从名字看出这个方法主要做标记、清除操作
     }

    void PSMarkSweep::invoke(bool maximum_heap_compaction) {

            .........

            PSMarkSweep::invoke_no_policy(maximum_heap_compaction);

     }

   void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {

            .........

            //从根开始对强引用开始进行标记操作

            Universe::oops_do(mark_and_push_closure());
            ReferenceProcessor::oops_do(mark_and_push_closure());
            JNIHandles::oops_do(mark_and_push_closure());   // Global (strong) JNI handles

            //跟踪每个线程堆栈,对堆栈里面的对象引用进行跟踪
            Threads::oops_do(mark_and_push_closure());
            ObjectSynchronizer::oops_do(mark_and_push_closure());
            FlatProfiler::oops_do(mark_and_push_closure());
            Management::oops_do(mark_and_push_closure());
            JvmtiExport::oops_do(mark_and_push_closure());

            //跟踪常量池用到的每个类
            SystemDictionary::always_strong_oops_do(mark_and_push_closure());
            vmSymbols::oops_do(mark_and_push_closure());

     }

   {

            if (!oopDesc::is_null(heap_oop)) {
                   oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
                  if (!obj->mark()->is_marked()) {
                          mark_object(obj);  //对遍历到的对象进行标志
                         _marking_stack->push(obj); //对象入栈
                 }

            }
     }

void Threads::oops_do(OopClosure* f) {

           for (JavaThread* p = _thread_list; p; p = X->next()){ //遍历所有用户线程

                   p->oops_do(f);

          }

          VMThread::vm_thread()->oops_do(f); //遍历vmThread

     }

void JavaThread::oops_do(OopClosure* f) {

           Thread::oops_do(f);

           ........

           //下面是堆栈桢的遍历

           for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
                   fst.current()->oops_do(f, fst.register_map());
           }

           ........

    }

    void  Frame::oops_do(OopClosure* f, RegisterMap* map) {

           oops_do_internal(f, map, true);

    }

    void frame::oops_do_internal(OopClosure* f, RegisterMap* map, bool use_interpreter_oop_map_cache) {

           if (is_interpreted_frame())    { //以解释桢为例

               oops_interpreted_do(f, map, use_interpreter_oop_map_cache);

            }

   }

   void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache) {

          ............

           oops_interpreted_locals_do(f, max_locals, mask);
    oops_interpreted_expressions_do(f, signature, is_static,
                                    m->max_stack(),
                                    max_locals, mask);

         ............

  }

  void frame::oops_interpreted_locals_do(OopClosure *f,
                                      int max_locals,
                                      InterpreterOopMap *mask) {

          for (int i = 0; i < max_locals; i++ ) {
                  Tag tag = interpreter_frame_local_tag(i);
                  if (tag == TagReference) { //如果是对象引用,则进行标记,总算找到了
                          oop* addr = (oop*) interpreter_frame_local_at(i);
                          assert((intptr_t*)addr >= sp(), "must be inside the frame");
                          f->do_oop(addr);
            }

}



分享到:
评论

相关推荐

    第一集 _ 高延迟问题的罪魁祸首System.gc().pdf

    在这种情况下,虽然没有直接涉及System.gc(),但这也揭示了在处理外部输入时,潜在的性能问题可能源自外部因素,需要对整个系统链路进行细致的监控和分析。 System.gc()的调用通常是不必要的,因为它会强制执行全局...

    tomcat输出输出着就不输出了,什么原因?解决方法是

    使用内存分析工具如MAT(Memory Analyzer Tool)进行排查。 6. **日志框架**:在实际的Java Web应用中,通常会使用Log4j、SLF4J等日志框架代替`System.out.println()`,因为它们提供更灵活的日志配置和输出控制。...

    System System命名空间源码

    .NET的垃圾回收机制是通过System.GC类实现的。通过查看GC的源码,我们可以学习到.NET如何自动管理内存,以及如何避免常见的内存泄漏问题。 六、泛型与类型转换 System命名空间中的泛型类,如List和Dictionary, ...

    jvm-full-gc.zip

    3. 显式调用System.gc():虽然不推荐,但手动调用会请求进行Full GC。 4. G1垃圾收集器的混合收集(Mixed GC)失败:G1在尝试进行混合收集时,如果无法满足目标空间需求,会退化为Full GC。 5. CMS(Concurrent Mark...

    Dalvik虚拟机垃圾收集(GC)过程分析.docx

    3. **GC_EXPLICIT**: 通过调用`System.gc()`、`VMRuntime.gc()`接口或接收到`SIGUSR1`信号时触发。 4. **GC_BEFORE_OOM**: 在即将抛出内存溢出异常前最后一次尝试回收内存。 每种类型的GC都对应着不同的`GcSpec`...

    java.lang.System类.pdf

    在实际开发中,`System`类的这些功能经常被用来进行日志记录、性能分析、资源管理等。例如,`currentTimeMillis()`常用于计算程序的执行时间,`arraycopy()`在需要高效复制大量数据时特别有用。理解并熟练使用`...

    Android中高级面试必知必会.pdf

    ArrayList .....25 3.LinkedList.........30 4.Hashset 源码分析........35 5. 内存模型.......47 6. 垃圾回收算法(JVM)..........63 7、垃圾回收机制和调用 System.gc()的区别? .64 8. 类加载过程90 9. 反射......

    android内存管理

    尽管可以尝试通过调用`System.gc()`来触发垃圾回收,但这并不总是最佳实践。调用此方法会导致当前线程暂停,等待GC完成,这可能会影响用户体验。而且,GC的工作方式是分批回收,可能导致内存并未完全清理,反而可能...

    java计时器

    - **强制垃圾回收**:在计时前后的`System.gc()`调用虽然可以减少垃圾回收的影响,但也会增加额外的时间消耗。 - **系统时间精度**:`System.currentTimeMillis()`返回的是当前系统时间,其精度取决于操作系统的时钟...

    00M原因以及分析处理

    1. 使用System.gc():System.gc()可以强制垃圾回收器回收垃圾对象,释放内存。 2. 使用LargeHeap: LargeHeap可以增加应用程序的内存大小,从而减少OOM错误的可能性。 3. 优化应用程序的性能:优化应用程序的性能...

    jvm-full-gc调优-jvm-full-gc.zip

    3. **触发Full GC的原因**:当老年代空间不足、持久代空间不足、System.gc()被显式调用、上一次GC后Heap的剩余空间小于历次GC平均普通对象大小等情况下,都可能导致Full GC的发生。 4. **GC调优的目标**:减少Full ...

    Java的垃圾收集器(GC)参考.pdf

    6. **System.gc()的使用**:尽管可以调用`System.gc()`建议JVM进行垃圾收集,但不应过度依赖这个方法,因为垃圾收集器何时执行、是否执行是不确定的,过度调用可能会增加系统开销,影响性能。 7. **内存泄漏与内存...

    奇迹通讯面试题目.doc

    - `System.gc();` 触发垃圾回收,但并不立即执行。即使执行了垃圾回收,`B.num` 的值也不会改变,因为它是静态的。 #### 3. 生产者消费者模型 **知识点概述:** - **生产者消费者模式:** 一种经典的并发编程...

    记录java.lang.OutOfMemoryErrorJava heap space的情况.docx

    1. 避免无谓的System.gc()调用,让JVM自行决定最佳的垃圾回收时机。 2. 调整堆大小,确保有足够的空间容纳程序运行所需的对象。 3. 使用对象池来复用对象,减少新对象的创建。 4. 使用合适的对象类型,避免创建不必...

    JVM、GC详解及调优

    4. **GC触发条件**:内存分配达到阈值、手动触发、System.gc()调用等都可能导致GC启动。 5. **GC参数调整**:通过JVM参数可以调整GC行为,如-Xms、-Xmx设置堆大小,-XX:NewRatio设置新生代与老年代比例,-XX:...

Global site tag (gtag.js) - Google Analytics