最近关注了一下垃圾回收的问题,想了解一下JVM 关于方法区的垃圾回收机制,找了几篇文章,不同的文章从不同角度讲述了一下,嗯。。。 拼凑起来 记录一下, 有些未验证正确性。。。

JVM 方法区

当JVM使用类装载器装载某个类时,它首先要定位对应的class文件,然后读入这个class文件,最后,JVM提取该文件的内容信息,并将这些信息存储到方法区,最后返回一个class实例。上面是对类的装载过程作了个简单的描述,看了上面一段文字,也许你会问:方法区是什么?里面存了哪些内容?下面我们将对方法区作一个详细的描述。 
   
     方法区是什么?有哪些特点?

方法区是系统分配的一个内存逻辑区域,是用来存储类型信息的(类型信息可理解为类的描述信息)。方法区主要有以下几个特点: 
      一.方法区是线程安全的。由于所有的线程都共享方法区,所以,方法区里的数据访问必须被设计成线程安全的。例如,假如同时有两个线程都企图访问方法区中的同一个类,而这个类还没有被装入JVM,那么只允许一个线程去装载它,而其它线程必须等待 
     二.方法区的大小不必是固定的,JVM可根据应用需要动态调整。同时,方法区也不一定是连续的,方法区可以在一个堆(甚至是JVM自己的堆)中自由分配。 
     三.方法区也可被垃圾收集,当某个类不在被使用(不可触及)时,JVM将卸载这个类,进行垃圾收集 
   
     方法区里存放的是哪些内容?

方法区里存的都是类型信息,也就是类的信息,而类的信息又包括以下内容: 
     类的全限定名(类的全路径名) 
    类的直接超类的全限定名(如果这个类是Object,则它没有超类) 
    这个类是类型(类)还是接口 
     类的访问修饰符,如public、abstract、final等 
     所有的直接接口全限定名的有序列表(假如它实现了多个接口) 
    常量池 
     字段、方法信息、类变量信息(静态变量)    装载该类的装载器的引用(classLoader)、类型引用(class)

原文地址: http://xtu-tja-163-com.iteye.com/blog/769992

还有一篇 不让转载的:http://blog.csdn.net/u010571316/article/details/45506567

接下来是关于-XX:+UseParNewGC和-XX:+UseConcMarkSweepGC两个参数的,看到有一个service启动的时候用了这两个参数,很是不解,于是找了找,以下内容就不是转载的了 算是翻译总结吧。。。

先来看一下这两个参数都是干什么的吧:

-XX:+UseConcMarkSweepGC

这个参数在官网有解释 http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#generation_sizing.young_gen

The concurrent collector performs most of its work concurrently (i.e., while the application is still running) to keep garbage collection pauses short. It is designed for applications with medium- to large-sized data sets for which response time is more important than overall throughput, since the techniques used to minimize pauses can reduce application performance. The concurrent collector is enabled with the option -XX:+UseConcMarkSweepGC

意思是说: 在保证正常的工作的同时让垃圾回收暂停的时间短一些,主要是用在反应时间比整体吞吐量更重要中大型的数据中,这个技术主要是最小化会影响程序效率的暂停。

-XX:+UseParNewGC

To enable a parallel young generation GC with the concurrent GC add -XX:+UseParNewGC to the startup. Don't add -XX:+UseParallelGC with this option.

要在使用并发收集器(concurrent GC也不知道这么翻译对么)的同时启用新生代的并行GC 就要加这个参数,不要加-XX:+UseParallelGC

来自: http://www.petefreitag.com/articles/gctuning/

虽然从上面那篇文章看来,好像两个都要设置的样子,反正我是这样理解的。。。

http://stackoverflow.com/questions/220388/java-concurrent-and-parallel-gc

在这里有个楼主问了同样的问题,然后就有大牛开始回答了,我仔细看了被接受的回答,主要意思是:

-XX:+UseConcMarkSweepGC 这个玩意如果设了,那么 -XX:+UseParNewGC 也是true的,如果不是才需要指定。。。

大牛们的意思就是 设了-XX:+UseConcMarkSweepGC 再设-XX:+UseParNewGC  就没意义了,没准在jdk6还会报错,然后底下也有很多人纷纷表示不需要再设了

然后可以用java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -version 试一下java到底设了啥。

大牛说他用的1.6.0_26 就是这样的效果。

以下亲测,分别是两个机器,嗯,随意感受一下:

版本一:

java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -version
-XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)

版本二:

java -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC -version
-XX:InitialHeapSize=59885760 -XX:MaxHeapSize=958172160 -XX:MaxNewSize=174485504 -XX:MaxTenuringThreshold=6 -XX:OldPLABSize=16 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)

哈哈不一样吧。。。 理论联系实际,看来还是要看情况的,估计是从1.60_xx 版本开始就不需要两个一起设置了,之前还是要滴。。。 至于是那个版本,要么去看官网,要么在使用的时候注意一下就好啦。

JVM 垃圾回收- 转载 知识碎片的更多相关文章

  1. JVM垃圾回收理论知识

  2. JVM基础系列第8讲:JVM 垃圾回收机制

    在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...

  3. JVM垃圾回收算法解析

    JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高, ...

  4. JVM垃圾回收?看这一篇就够了!

    深入理解JVM垃圾回收机制 1.垃圾回收需要解决的问题及解决的办法总览 1.如何判定对象为垃圾对象 引用计数法 可达性分析法 2.如何回收 回收策略 标记-清除算法 复制算法 标记-整理算法 分带收集 ...

  5. JVM 垃圾回收算法和垃圾回收器

    JVM 垃圾回收算法和垃圾回收器. 一.垃圾回收的区域 栈:栈中的生命周期是跟随线程,所以一般不需要关注. 堆:堆中的对象是垃圾回收的重点. 方法区:这一块也会发生垃圾回收,不过这块的效率比较低,一般 ...

  6. JVM垃圾回收机制总结:调优方法

    转载: JVM垃圾回收机制总结:调优方法 JVM 优化经验总结 JVM 垃圾回收器工作原理及使用实例介绍

  7. JDK分析工具&JVM垃圾回收(转)

    转自:http://blog.163.com/itjin45@126/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/ ...

  8. jvm - 垃圾回收

    jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 垃圾回收的意义 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回 ...

  9. JVM垃圾回收算法(最全)

    JVM垃圾回收算法(最全) 下面是JVM虚拟机运行时的内存模型: 1.方法区 Perm(永久代.非堆) 2.虚拟机栈 3.本地方法栈 (Native方法) 4.堆 5.程序计数器 1 首先的问题是:j ...

随机推荐

  1. 文件和I/O流

    版权声明:本文为[博主](https://zhangkn.github.io)原创文章,未经博主同意不得转载.https://creativecommons.org/licenses/by-nc-sa ...

  2. python一条语句分析几个常用函数和概念

    前言 过年也没完全闲着,每天用一点点时间学点东西,本文为大家介绍几个python操作的细节,包含all.any.for in等操作,以及介绍我解决问题的思路. 一.开篇 先从我看到的一个简单的语句开始 ...

  3. 什么是HBASE(三) HBase的压缩和编码

    在存储层面节省空间的处理上,Hbase提供了两种方案,一个是基于key的编码,一个是基于数据块(data block)的压缩.前者用于将key重复部分进行简单处理达到节约空间的目的,后者则是对数据块进 ...

  4. 玩转Panabit 2008 Live CD到U盘,Panabit随身行

    直接将Panabit 2008 Live CD的内容复制到U盘,即把Live CD转成U盘启动盘,U盘可写,方便保存配置.要能正常使用,必须机器支持USB启动,才能用上:但是熟悉此方法,同样可以灵活用 ...

  5. 编译安装php-5.4.44

    编译安装php-5.4.44 1. 首先,安装必要的库文件,一面编译被打断: yum install -y gcc gcc-c++  make zlib zlib-devel pcre pcre-de ...

  6. struts1的一个简单登陆功能

    Login.jsp: <form action="<%= request.getContextPath() %>/login.do" method="p ...

  7. 【POJ】3378 Crazy Thairs(树状数组+dp+高精)

    题目 传送门:QWQ 分析 题意:给个数列,求有多少五元上升组 考虑简化一下问题:如果题目求二元上升组怎么做. 仿照一下逆序对,用树状数组维护一下就ok了. 三元怎么做呢? 把二元的拓展一位就可以了, ...

  8. VueRouter

    使用VueRouter的前提: 1, 必须导入vue-router.js文件    2, 要有VueRouter()实例    3, 要把VueRouter实例挂载到Vue实例中 4, 路由的入口   ...

  9. 关于常见的协议BSD,APACHE,MIT,GPL的理解

    其实BSD和APACHE和MIT协议类似,基本就是可以为所欲为,但是要尊重原来的作者. GPL协议是一个免费和开源的协议,只要用了GPL协议的类库源码等,也必须适应GPL协议. 意思就是把开源和免费进 ...

  10. 用 Vue 改造 Bootstrap,渐进提升项目框架

    前言 Vue 横空出世,以迅雷不及掩耳之势横扫前端界,俨然有当年 jQuery 之势.我认为 Vue 成功的关键在于三点: 学习曲线平缓,有点经验的前端基本上一天就能看完文档,然后就可以上手操作. 上 ...