关闭

java垃圾回收那点事(五)ParallelGCThreads参数

10848人阅读 评论(0) 收藏 举报
分类:

为了提高垃圾回收的性能,java在parallel回收的时候可以设置同时并行处理的线程数也就是ParallelGCThreads,如果你没有设置该参数,该参数jvm会默认设置成online的cpu的核数但并不包括被shutdown的cpu的核数。

Linux 下获取online的cpu的核数

int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);

前面曾经提到过GC的主要过程是由VMThread线程执行,在执行parallel的时候,VMThread线程实际上是在等待线程执行结果的,这也就是为什么并没有设置ParallelGCThreads= online cpu core-1


Parallel gc 和CMS里的young区都可以设置ParallelGCThreads参数,下面主要讲的是Parallel GC

1. Parallel Threads 初始化

Parallel Threads本质是由gcTaskManager管理的gcTaskThread, 在parallelScavenge.cpp 中的initialize() 方法中通过GCTaskManager::create(ParallelGCThreads);初始化gcTaskThread的,也就是当jvm启动的时候thread 就已经创建并且运行。

参数:BindGCTaskThreadsToCPUs

 jvm在linux中并没有对gcTaskThread线程绑定到固定的cpu上,但在solaris上却支持了,请参考函数os::distribute_processes 和 os::bind_to_processor


2. GCTaskQueue

这是一个存放的元素是GCTask的链表结构,指针_insert_end指向最后一个元素,指针_remove_end指向第一个元素

GCTask本身也是一个链表结构,指针_newer指向后面的元素,_older指向前面一个元素,可以参考下面的图


当增加一个GCTask C的时候,会从Queue中取出_insert_end的GCTask B,设置B _newer 为C, 设置C older_为B,设置_insert_end为C

当取一个GCTask的时候,从Queue取出_remove_end的GCTask B, 设置_remove_end为C,设置C的old为null, 设置 B的new为nul


参数 UseGCTaskAffinity

通过设置_affinity 属性用于表示该task的是由哪个线程执行,当GCTaskThread运行的时候会取出该线程的所对应的task

做法使用轮询从queue的第一个开始顺序查找,一直找到然后移除。


3. GCTaskThread 运行

GCTaskThread不停轮询GCTaskQueue,当Queue里面没有数据的时候,线程会wait等待,直到有数据插入notify线程,由于Queue的操作并不是线程安全的,需要在增加和删除的时候申请互斥锁MutexLockerEx ml(monitor(), Mutex::_no_safepoint_check_flag);


VMthread 线程在Parallel GC 时候将任务添加到queue中,然后等待结果。



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

jdk1.6中垃圾收集器

原文:http://www.fx114.net/qa-256-136435.aspx 图1展示了1.6中提供的6种作用于不同年代的收集器,两个收集器之间存在连线的话就说明它们可以搭配使用。在介绍着些...
  • sunshineboy_oO
  • sunshineboy_oO
  • 2015-10-17 20:06
  • 1780

Weblogic内存回收机制设计不合理导致服务器CPU使用率100%

一台16逻辑CPU的Weblogic服务器,CPU使用率持续100%。 一个进程,就占用了百分之一千三百多,也就是说,公此一个进程,就完全消耗了13颗CPU资源。
  • ljunjie82
  • ljunjie82
  • 2015-12-30 22:13
  • 4172

java垃圾回收那点事(四)谁执行了GC的任务

在第一篇中曾经提到过,System.gc 曾经调用代码 Universe::heap()->collect(GCCause::_java_lang_system_gc); 而每个不同类型的gc,使用不...
  • raintungli
  • raintungli
  • 2013-09-11 10:46
  • 2274

《C#妹妹和Objective-C阿姨对话录》(04)垃圾回收基础--拆迁队那点事

转载自:小墨的童鞋 C#妹妹:操作系统天天说控制内存空间价格,咋还这么高?我巨资购买的内存空间,后来发现竟然在硬盘上!虚拟内存!TMD! Objective-C阿姨:操作系统全靠卖内存空间...
  • i3039
  • i3039
  • 2011-12-14 14:57
  • 4310

JVM内存结构、垃圾回收那点事

翻看电脑的文件夹,无意看到了9月份在公司做的一次分享,浏览了一下"婆婆特",发现自己在ppt上的写的引导性问题自己也不能确切的回答出来,哎,知识这东西,平时不常用的没些日子就生疏了。于是,本小白决定把...
  • tyfbhlxd
  • tyfbhlxd
  • 2017-05-18 14:00
  • 219

关于GC垃圾回收的那点事

因为GC的复制算法,导致从1536-》1536K ,总空间少掉1536K。一般大对象以及一直存活经过多次GC未能回收的对象都会进入老年代。
  • wyz220
  • wyz220
  • 2017-11-06 21:47
  • 37

还是Flash垃圾回收那点事(转)

转载▼ Flash垃圾回收机制是我们Flash编码人员必备的一个知识,若是不了解这玩意儿,哼哼~你就等着别人在玩你开发的应用的时候越来越卡吧……          很多人都多少...
  • icyday
  • icyday
  • 2014-05-10 15:58
  • 444

java高分局之JVM命令参数大全(高级垃圾回收选项)

java高分局之JVM命令参数大全(高级垃圾回收选项)这些选项控制Java HotSpot虚拟机怎么进行垃圾回收。 - -XX:+AggressiveHeap java堆最佳化设置。设置多个参数...
  • maosijunzi
  • maosijunzi
  • 2015-06-19 16:02
  • 7126

JVM实用参数(五)新生代垃圾回收

本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation)。首先我们会讨论为什么调整新生代的参数会对应用的性能如此重要,接着我们将学习新生代相关的JVM参数。 ...
  • jl506269268
  • jl506269268
  • 2014-07-12 10:10
  • 321

JVM实用参数(五)新生代垃圾回收

原文链接 作者: PATRICK PESCHLOW ;译者:严亮本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation)。首先我们会讨论为什么调整新生代的参数会...
  • benben683280
  • benben683280
  • 2017-12-06 10:55
  • 13
    个人资料
    • 访问:483028次
    • 积分:5318
    • 等级:
    • 排名:第5944名
    • 原创:99篇
    • 转载:3篇
    • 译文:0篇
    • 评论:73条
    最新评论