前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >周末福利大放送,免费领取付费星球;jvm研究所的入场券,先到先得

周末福利大放送,免费领取付费星球;jvm研究所的入场券,先到先得

作者头像
用户1257393
发布2018-03-21 17:16:59
6980
发布2018-03-21 17:16:59
举报
文章被收录于专栏:精讲JAVA
知道各位周六日不太爱看文章,哈哈,小编周末也不想写文章,所以,我就把这周的几个星球里面出现的问题贴出来吧

Q1

Action:项目部署到生产环境中用命令jstat gcutil查看gc情况 为什么永久代使用率一直是99%

D1

我:

球友,你好,根据你提出的问题,现提出一种解决思路,首先讲解一下永久代,永久代在hotspot中,jvm方法区可以理解为永久代,其他的虚拟机中应该没有,我比较了解hotspot,其他的虚拟机没有研究过,解决思路如下,

1、一般出现高占内存的永生带,我们应该先去检查虚拟机的永生带内存配置(可以使用jmap -heap pid,篇尾讲解),或者设置高点永生带内存,修改虚拟机的-XX:MaxPermSize(最大),-XX:PermSize(初始),尽量将两个设置为一样的,这样可以避免扩展内存,其实也可以说不允许扩展内存,

2、再次使用jstat -gc pid(jmap -heap pid),永生带主要是存储常量,静态变量、类信息等程序过多的load class,就会出现内存过高。

3、如果依然没变化,检查jvm版本,是否过低,低版本的对此区域回收不完全,会造成高内存情况。

4、其实差不多上面就可以找到问题所在,如果还不可以,(万不得已,特别是生产环境,不推荐使用下面方法,极特殊会因为这个,星主自己的见解)修改jvm的回收算法,修改–XX:+UseParallelOldGC,该回收算法变相降低新生代回收速度,提高老年代,永生带并非是一个永生环境,对于常量池的回收和类型的卸载,也是进行的,并且是很有必要的,因为在Java虚拟机规范中曾提到,方法区(永生带)无法满足内存要求时,也会溢出,为什么说尽量不要使用这个方法,因为虚拟机大部分回收发生在新生代,降低新生代回收速度,很可以出现很严重的问题

jmap -heap pid可以查看堆使用情况

PermSize= 256MB //对应jvm启动参数-XX:PermSize=XX:设置JVM堆的‘永生代’的初始大小

Q2

匿名:能否讲解一下,新生代,老年代,永生代等。小白一个

D2

我: 球友你好,首先我说一点,提问不需要匿名,谁都是从小白走过来的,是小白不丢人只要是认真学习的,那便受人尊敬。好,我给你讲解一下这个问题

首先我们先想想为什么要分代,不分代不可以吗,答案是肯定的,当然可以不分代,分代的意义在于优化,有一部分内存没用了,我们需要回收,但是有很多对象都是朝生夕死,速度很快,而有的却需要长时间使用,长时间使用的,回收了还要创建,浪费资源,所以我们根据jvm中使用的东西进行分带,经常使用的我们把它们加入老年代,用完不用的我们把它加入新生代,这样可以为我们腾出很大的内存空间。那我们说说什么叫新生代,hotspot把新生代分为1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,一般情况下,新创建的对象都会被分配到Eden区,如果Minor GC一次后还存在,将会加入Survivor,每次对象坚持在Minor GC存活一次,这个对象就会计数+1,当达到某个数值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)后,就会转移到老年代,新生代的算法是复制算法,关于什么叫复制算法,可以百度,在新生代开始GC时,所有的对象都存在于Eden跟from中,当GC完成后,Eden中还存在的对象会进入to,在from中的对象,根据计数的个数取决去哪,没达到阈值的进入to,达到的进入老年代,所以每次进行GC后,from跟Eden都是空,第二次GC时,上一次的to就变成这一次的from,(不知道我这么说能不能明白)因为没有进入老年代,第二次Minor GC还会对from,也就是这一次的from

中的对象进行回收,反复重复该过程。什么叫做老年代呢,老年代都是从新生代熬过来的对象,就是达到年龄阈值的对象,所以老年代不会那么频繁的进行回收了,老年代的回收称为Major GC 就是清理老年代,老年代回收频率低于新生代。什么叫做永久代呢,其实永久代在hotspot中就是方法区,存放常量池等东西地方。以后可以会取代,大家了解就好

共产主义接班人: 第二次GC的时候,上一次的to就变成了这次的from,是为什么啊?这一点不太理解

我:你看啊,第一次gc完成后,是不是eden跟from都已经空了,有的去老年代了,有的去to了,而第二次gc时,肯定还要清除新生代的东西吧,所以to中的东西就被清除了,而我们的理解是,to是被gc后去的区域,所以这个时候两个区域相当于"互换",其实你可以这样理解,就是说每次gc,其实就是gc一个eden跟其中一个survivor,总有一个suivivor是空闲的。

Q3

共产主义接班人:我们的生产环境中,一台服务器上有十几个运行的jar项目,启动项目的时候,配置那些启动参数,比如内存分配等,应该如何分配才能达到最优?比如服务器内存4g,有十个jar文件

D3

我:这个没办法说,都是根据工程的使用频率跟所处功能来说的,一般的来说,如果无巨大的区别,把这十几个项目平均分配就可以,可以给连接数据库的项目多一些内存。这里要注意,切莫将最大内存超越服务器的物理内存,4g的服务器,要给电脑自己留出一部分。防止linux的内存不足

部分截图:

最后,小编星球刚建立,希望大家在该文章下面留言,自己遇到的问题,我会发放五个免费加入星球的名单,选出最有代表的,大家共同进步

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精讲JAVA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档