jvm的几个概念误区
serial old是一种垃圾回收器
serial old其实表示的是一种说法,老年代单线程回收。在不同的垃圾回收器中实现各部相同,现在有以下几种实现g1MarkSweep,psMarkSweep,genMarkSweep。
parallel gc日志里的老年代名称有时候会变
其实是老年代回收器不一样。 老年代回收器为psMarkSweep的是叫PSOldGen。 老年代回收器为psParallelCompact的是叫ParOldGen。 每个版本的jvm默认垃圾回收算法不一样,如果默认是-XX:+UseParallelOldGC,你自己虽然设置了-XX:+UseParallelGC。但是也会有是加了-XX:+UseParallelOldGC的效果。
full gc其实是minor gc,然后执行old gc。
其实full gc就是fullgc。是区别于minor gc,old gc。
full gc的算法其实很多
准确来说真的只有一种。标记-清除-压缩。实现是有多种的。
cms的backgroud gc的时候只回收老年代。
这个也是有参数控制的。CMSScavengeBeforeRemark,默认是关闭的。
survivor 某个年龄对象达到survivor 区域的50%就发生晋升。
50%其实是一个参数控制的,TargetSurvivorRatio。默认50。 并不是某个年龄的对象大小达到。找出从1开始,累加和超过TargetSurvivorRatio的比值的那个年龄。从那个年龄开始以上的对象有资格晋升。需要和MaxTenuringThreshold对比找到最小的那个年龄。
对象优先生成在eden
其实最优先的应该是栈上分配,其次是tlab(eden的一部分),然后尝试大对象直接尝试老年代的逻辑,如果不满足,则在eden上分配。
直接内存和元数据区有关系
元数据区(1.6永久带)概念上是非堆。直接内存是另外的区域,nio申请的就是这里的,有参数控制大小-XX:MaxDirectMemorySize,默认和堆的内存一样大,并且和jni用的内存概念上也不是一回事。
parallel gc的时候就是先执行一次minor gc,然后再old gc。
这是有个参数ScavengeBeforeFullGC老控制的。默认是打开的,日志内容输出如下
[GC (System.gc()) [PSYoungGen: 1843K->776K(35840K)] 1843K->784K(117760K), 0.0022147 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (System.gc()) [PSYoungGen: 776K->0K(35840K)] [ParOldGen: 8K->637K(81920K)] 784K->637K(117760K), [Metaspace: 2658K->2658K(1056768K)], 0.0091183 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
当关闭掉的时候日志如下
[Full GC (System.gc()) [PSYoungGen: 1843K->0K(35840K)] [ParOldGen: 0K->637K(81920K)] 1843K->637K(117760K), [Metaspace: 2658K->2658K(1056768K)], 0.0101733 secs] [Times: user=0.03 sys=0.01, real=0.01 secs]
区别就是少了那次minor gc。而且后面都是fullgc。并不是old gc。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
说一说 Spring AOP 中 @Aspect 的高级用法
1 切点复合运算 支持在切点定义中加入以下运算符进行复合运算: 运算符 说明 && 与运算。 ! 非运算。 || 或运算。 2 切点命名 一般情况下,切点是直接声明在需要增强方法处,这种切点的声明方式称为匿名切点,匿名切点只能在声明处被使用 。 如果希望在其它地方可以重用这个切点,我们可以通过 @Pointcut 注解及切面类方法来命名它。 public class NamePointcut { /** * 切点被命名为 method1,且该切点只能在本类中使用 */ @Pointcut("within(net.deniro.spring4.aspectj.*)") private void method1() { } /** * 切点被命名为 method2,且该切点可以在本类或子孙类中使用 */ @Pointcut("within(net.deniro.spring4.aspectj.*)") protected void method2() { } /** * 切点被命名为 method3,且该切点可以在任何类中使用 * 这里还使用了复合...
- 下一篇
Spring Mvc之定制RequestMappingHandlerMapping
在上文Spring MVC之RequestMappingHandlerMapping匹配中我们讲到,Spring在进行request匹配的时候,不仅会匹配url,method,contentType等条件,还会对用户提供的定制条件进行匹配,用户提供的定制条件是使用RequestCondition进行封装的。本文以本人工作的一个实际案例来讲解如果使用RequestCondition进行request的匹配过程进行定制,并且会对这种匹配过程需要注意的问题进行讲解。 1. 背景描述 本人从事的项目主要是售卖房源的,这里每个用户都有自己的网址,这些网址是通过二级域名的方式进行配置的,比如A用户的网址为a.house.com,B用户的网址为b.house.com。另外,我们也为每个用户提供了多套模板进行房源的展示。这种设计的优点在于用户如果需要将其网址进行SEO,那么可以通过统一的方式进行处理,并且通过二级域名我们就可以知道当前网站所属用户是谁。但这里存在的问题是,比如对于同一个页面的不同模板,虽然主体部分是相同的,但是页面细节上是有很大不同的,因而使用不同的接口对其进行处理是很有必要的,但是这...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Linux系统CentOS6、CentOS7手动修改IP地址