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

知道各位周六日不太爱看文章,哈哈,小编周末也不想写文章,所以,我就把这周的几个星球里面出现的问题贴出来吧

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的内存不足

部分截图:

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

原文发布于微信公众号 - 精讲JAVA(toooooooozi)

原文发表时间:2018-03-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猿人谷

Java性能调优

一、JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm)   其中N...

314110
来自专栏行者悟空

Java HotSpot G1垃圾优先型垃圾回收器调优

30450
来自专栏腾讯玄武实验室的专栏

IE 沙箱拖拽安全策略解析

在本文中,笔者将以一个攻击者的视角,尝试各种途径来突破 IE 沙箱的这一安全策略,通过分析所遇到的障碍,达到对IE沙箱拖拽安全策略进行详细解析的目的。

31010
来自专栏无题

GC优化案例3:CMS Remark之前强制minorGC

对GC优化的案例进行的系列总结(三): 请求高峰期发生GC,导致服务可用性下降 确定目标 GC日志显示,高峰期CMS在重标记(Remark)阶段耗时1.39s...

48330
来自专栏小灰灰

jvm调优的工具介绍

jvm调优实战笔记之基础知识简介 I. 背景 java后端,提供了一个svg渲染的服务,在qps较大时,会出现频繁的gc,而此时的服务器性能本身并没有达到瓶颈...

56670
来自专栏个人分享

JVM知识学习与巩固

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模...

12310
来自专栏码代码的陈同学

JVM内存管理

Java内存管理是一项持续的挑战,同时也是锻造出可拓展应用的必备技能。本质上,Java内存管理就是一个为新对象分配内存和释放无用对象内存的过程。

53580
来自专栏Java面试笔试题

GC是什么?为什么要有GC?

GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象...

22850
来自专栏芋道源码1024

大型跨境电商 JVM 调优经历

前提: 某大型跨境电商业务发展非常快,线上机器扩容也很频繁,但是对于线上机器的运行情况,特别是jvm内存的情况,一直没有一个统一的标准来给到各个应用服务的own...

21700
来自专栏小勇DW3

JVM调优(二)经验参数设置

    JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下...

21360

扫码关注云+社区

领取腾讯云代金券