性能优化(JVM概念及配置)

虚拟机组成

一次编写,到处运行

Java虚拟机是对操作系统的模拟,隔离差异

72e10e031b29bc03dd15c4957b847d536d6.jpg

2018编程语言排行榜

a7932f5d38969f83a9dc9df074cf04cb22e.jpg

d7853308989e1aad101a8a5a677637db1cc.jpg

一个复杂的构架

4ff111095245e4c61db701d0d0040f44725.jpg

虚拟机的内部概念

86acfdf441a823e6266c21ab32e297ba1ab.jpg

 

运行原理

编译器,解释器执行流程

b49127d928fa65545399fca237705492c64.jpg

7d440efbe713145fbba4a5251069dfd2ff7.jpg

内存分配-线程模型

3185964e0cc2e1a94b945b870ef70254158.jpg

栈帧模型

4bdb9daafbe58520fd6d232990bf423ee17.jpg

 

内存管理

内存分配-堆区

9eb1dc1259ca630658ab04ceee0abdcbdc4.jpg

堆内存分配

9bcc08aa62a55aea4ae10035efb3e1a12b1.jpg

 

垃圾回收策略

收集器

9d9b4d6df0326c4fed6d0b98381c6b72097.jpg

1.Serial GC。单线程,所有的线程暂停。一般用于Client模式的JVM中。
2.ParNew GC。是在SerialGC的基础上,增加了多线程机制。
3.Parrallel Scavenge GC。吞吐量优先收集器,吞吐量=程序运行时间/(JVM执行回收的时间+程序运行时间), 运行100分钟,GC占用1分钟,吞吐量=99%。server模式JVM默认配置。
4.ParallelOld。老生代并行收集器的一种,使用了标记整理算法,是JDK1.6中引进的。
5.Serial Old,CMS收集器失败后的备用收集器。
6.CMS又称响应时间优先回收器,使用标记清除算法。他的回收线程数为(CPU核心数+3)/4,所以当CPU核心数为2时比较高效些。CMS分为4个过程:初始标记、并发标记、重新标记、并发清除。

6f0e533f6edb88adb6f30ce035118f362c0.jpg

fd99a97446224d7130b663ec144ed756e6f.jpg

确定垃圾-引用计数法

6bfdf687c52d100649ad5648529d5c2a8ab.jpg

确定垃圾-可达性分析

ef540b741527beabade7241bbae99c1cde7.jpg

GC算法

1 、标记- 清除(Mark-Sweep )算法

0e8395ce73d471926386ace1a4fda4efc2f.jpg

标记- 清除算法将垃圾回收分为两个阶段:
1.标记阶段:首先标记出所有需要回收的对象。
2.清除阶段:标记完成后,统一回收被标记的对象
缺点:
3.效率问题:标记清除过程效率都不高。
4.空间问题:标记清除之后会产生大量的不连续的内存碎片( 空间碎片太多可能会导致以后在程序运行过程中需要分配较大的对象时,无法找到足够的连续的内存空间而不得不提前触发另一次垃圾收集动作。)

2 、复制(Copying )算法

9fad692cf2bff667c050c064fa95e294746.jpg

2.1. 算法思想:
1).将现有的内存空间分为两块,每次只使用一块.
2).当其中一块用完的时候,就将还存活的对象复制到另外一块上去。
3).再把已使用过的内存空间一次清理掉。
2.2. 优点:
1).由于是每次都对整个半区进行内存回收,内存分配时不必考虑内存碎片问题。
2).只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
2.3. 缺点:
1).内存减少为原来的一半,太浪费了。
2).对象存活率较高的时候就要执行较多的复制操作,效率变低。
3).如果不使用50%的对分策略,老年代需要考虑的空间担保策略。

 

3 、标记- 整理(Mark-Compact )算法

e94d35db56de974c40a1a66de7697173d3c.jpg

1).标记阶段:首先标记出所有需要回收的对象。与“标记-清除”一样
2).让存活的对象向内存的一段移动。而不跟“标记-清除”直接对可回收对象进行清理
3).再清理掉边界以外的内存。由于老年代存活率高,没有额外内存对老年代进行空间担保,那么老年代只能采用标记-清理算法或者标记整理算法。

 

4 、分代收集算法

以上三种算法的综合
在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,选用:复制算法
在老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清除”或者“标记-整理”算法来进行回收。

 

一些工具

•jps
•jmap
•Jstat
•Jvisualvm: window下启动远程监控,并在被
监控服务端,启动jstatd服务。

-jmap

Mark Sweep Compact GC
Heap Configuration: #堆内存初始化配置
MinHeapFreeRatio = 40 #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率
MaxHeapFreeRatio = 70 #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率
MaxHeapSize = 100663296 (96.0MB) #-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 1048576 (1.0MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 4294901760 (4095.9375MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 4194304 (4.0MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小
NewRatio = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize = 12582912 (12.0MB) #-XX:PermSize=<value>:设置JVM堆的‘持久代’的初始大小
MaxPermSize = 67108864 (64.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘持久代’的最大大小
Heap Usage:
New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含伊甸园区+1个Survivor区
capacity = 30212096 (28.8125MB)
used = 27103784 (25.848182678222656MB)
free = 3108312 (2.9643173217773438MB)
89.71169693092462% used
Eden Space: #Eden区内存分布
capacity = 26869760 (25.625MB)
used = 26869760 (25.625MB)
free = 0 (0.0MB)
100.0% used

From Space: #其中一个Survivor区的内存分布
capacity = 3342336 (3.1875MB)
used = 234024 (0.22318267822265625MB)
free = 3108312 (2.9643173217773438MB)
7.001809512867647% used
To Space: #另一个Survivor区的内存分布
capacity = 3342336 (3.1875MB)
used = 0 (0.0MB)
free = 3342336 (3.1875MB)
0.0% used
tenured generation: #当前的Old区内存分布
capacity = 67108864 (64.0MB)
used = 67108816 (63.99995422363281MB)
free = 48 (4.57763671875E-5MB)
99.99992847442627% used
Perm Generation: #当前的 “持久代” 内存分布
capacity = 14417920 (13.75MB)
used = 14339216 (13.674942016601562MB)
free = 78704 (0.0750579833984375MB)
99.45412375710227% used

 

 

 

转载于:https://my.oschina.net/u/3728166/blog/2990651

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值