关注
堆内存调整参数(调优的关键)
通过以上两篇的文章我们可以发现每一个区域都有一个可变的伸缩区,当我们的内存空间不足的时候,会在可变的范围内扩大内存空间,当我们的内存空间变得不紧张的时候我们再释放可变空间。
在堆内存的调优之中我们要特别注意两个参数-Xms初始化内存分配大小,默认为物理内存的1/64,-Xmx 最大的分配内存默认为物理内存的1/4。
以本人8G电脑来说:
class GCDemo
{ public static void main(String[] args)
{
Runtime run =Runtime.getRuntime(); long maxMemory =run.maxMemory(); long totalMemory =run.totalMemory();
System.out.println("总内存"+(maxMemory/(double)1024/1024)+"M");
System.out.println("可用内存"+(totalMemory/(double)1024/1024)+"M");
}
}
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
输出GC的处理日志:
那么现在的可调整内存空间(伸缩区)就在123M-1810M之间,这样可能造成程序的性能下降,所以我们将初始内存空间和最大的内存空间设置为相等。就避免了伸缩区的可调策略。从而提升程序的性能。
输出GC的处理日志:
可以看出调整后的堆内存的每个区域都比以前大了,此时没有可伸缩的区域,而且也解释了前面的问题,老年代的内存空间是最大的,而两个存活的内存一定是相等的。
年轻代参数调整
所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区中存在好久,并且经过了好几次的Minor
GC还保存下来的活跃对象。那么这个对象将晋升到存活区之中,存活区一定会有两块空间,这两块空间的大小一定是相等的,目的:一块存活区为了晋升、另外一块存活区为了对象回收。这两块内存空间一定有一块是空的。在年轻代中使用的是Minor
GC,这种GC算法采用的是复制算法。
Minor GC 实现算法:
首先扫面伊甸园区中的存活对象,其中有活跃对象和不活跃对象。此时会将活跃的对象晋升到其两个存活区中的那个空的存活去中而另一个存活区中的活跃对象也会复制到这个存活区,如果该存活区还有不活跃对象会晋升到老年代中。以保证必须有一个空的存活区这时伊甸园会产生新的空间,保存新的对象。
通过以上分析会发现伊甸园区中保存的对象大部分可能是临时对象,那么这就会频繁的发生Minor
GC,所以HotSpot为了加快此空间的分配操作,采用了两种技术。
Bump-The-Pointer
该技术采用栈的形式,每一个最后保存的对象一般都会保存在伊甸园区的顶部,这样的话只要每创建一个新的对象我们就只需要检查保存对象后面是否有新的空间即可。
TLAB
Bump-The-Pointer虽然提高了内存的分配速度但是如果是多个线程同时保存一个对象那?显然是不适合的所以TLAB算法又将伊甸园区分为多个数据块,每个数据块使用Bump-The-Pointer进行对象的保存和分配。
老年代参数调整
老年代主要是接收由年轻代发送来的对象,一般情况下经过了好几次的Minor
GC之后还会保存下来的对象才会进入到老年代。如果你要保存的对象超过了伊甸园区的大小,那么此对象也将直接保存到老年代之中。当老年代内存不足时将引发“Full GC在老年代里面会采用两种算法结合的模式实现GC的处理:整理-压缩。
标记-清除
在活跃对象较多时比较高效,但是由于该算法直接回收内存对象会造成内存的碎片化这也是最头疼的问题。
标记-压缩
在标记-清除的基础上进行对象的移动,成本较高,但是不产生碎片。类似于电脑的磁盘管理。
永久代参数调整
虽然jdk1.8中没有永久代但是javaEE目前依然是1.7
元空间参数调整
总结
1、JDK 1.8中的内存分为:年轻代、老年代、元空间;
2、年轻代有两个组成部分:伊甸园区、两个存活区,GC回收策略为“复制”;
3、老年代的保存空间一般较大,使用的是“整理-压缩”GC回收策略。 4、JDK 1.8之前存在有永久代; 面试题:
一般什么时候会发生GC?如何处理?
Java中的GC会有两种回收:年轻代的Minor GC,另外一个就是老年代的Full
GC;新对象创建时如果伊甸园空间不足会触发 MinorGC,如果此时老年代的内存空间不足会触发Full
GC,如果空间都不足抛出OutOfM emoryError 。 面试题:
如果整个Java项目运行缓慢,你该如何解决?
避免堆内存的伸缩空间进行操作,将初始化内存空间与整体堆内存空间大小设置为一一样,使用“-Xms”、“-Xmx” 面试题:
当一个对象非常大的时候,请问是如何保存的? 该对象将直接保存在老年代。
查看原帖
点赞 评论
相关推荐
05-09 16:47
南京邮电大学 Java king122:专业技能不要写这么多,熟悉和熟练你经不住问,排版有些难看,中间的空隙搞小一点,项目描述的话感觉是从课程中抄下来的,改一改吧,不然烂大街了,每个项目都写一两点,用什么技术实现了什么难点,然后再写一些数字上去像时间又花了90%这样,这样面试会多一些,如果觉得自己的项目还是不够用的话,我有几个大厂最近做过的实习项目,感兴趣的话可以看我简介中的项目地址
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 如何准备秋招 #
8495次浏览 150人参与
# 软开人,秋招你打算投哪些公司呢 #
100368次浏览 941人参与
# 现代汽车前瞻技术研发急速编程挑战赛 #
21220次浏览 181人参与
# 你觉得实习能学到东西吗 #
12318次浏览 301人参与
# 秋招什么时候开投比较合适? #
5075次浏览 110人参与
# 实习,不懂就问 #
24175次浏览 369人参与
# 每个月的工资都是怎么分配的? #
11921次浏览 272人参与
# 你觉得现在还能进互联网吗? #
3855次浏览 91人参与
# 技术岗笔试题求解 #
75271次浏览 974人参与
# 预测一下26届秋招形势 #
19772次浏览 207人参与
# 你最近一次加班是什么时候? #
67587次浏览 346人参与
# 高考出分的那一天,我__ #
13703次浏览 230人参与
# 打工人的精神状态 #
53200次浏览 966人参与
# 米哈游工作体验 #
17500次浏览 116人参与
# 机械实习一天多少钱合适? #
28678次浏览 176人参与
# 你觉得实习只能是打杂吗? #
191958次浏览 1211人参与
# 聊聊你的职场新体验 #
161103次浏览 1389人参与
# 来聊聊你认为的薪资天花板是哪家? #
30656次浏览 174人参与
# 安利/避雷我的专业 #
75802次浏览 522人参与
# 牛客十周岁生日快乐 #
144801次浏览 1609人参与
# 你们公司几号发工资 #
18667次浏览 116人参与