Skip to content

Latest commit

 

History

History
127 lines (79 loc) · 4.37 KB

3.java应用性能优化.md

File metadata and controls

127 lines (79 loc) · 4.37 KB

java应用性能优化

JVM 组成

垃圾回收算法

查找垃圾的几种方式

  1. 引用计数(存在循环引用问题)
  2. 根搜索(可达)算法 Root Searching

标记-清除 Mark-Sweep

  • 标记阶段,找到所有可访问对象打个标记。清理阶段,遍历整个堆
  • 对未标记对象(即不再使用的对象)逐一进行清理

特点: 优点:算法简单 缺点:标记-清除最大的问题会造成内存碎片,但是不浪费空间,效率较高(如果对象较多时,逐一删除效率也会受到影响)

标记-压缩 (压实)Mark-Compact

  • 标记阶段,找到所有可访问对象打个标记
  • 内存清理阶段时,整理时将对象向内存一端移动,整理后存活对象连续的集中在内存一端。

特点:

  • 标记-压缩算法好处是整理后内存空间连续分配,有大段的连续内存可分配,没有内存碎片。
  • 缺点是内存整理过程有消耗,效率相对低下

复制 Copying

先将可用内存分为大小相同两块区域A和B,每次只用其中一块,比如A。当A用完后,则将A中存活的对 象复制到B。复制到B的时候连续的使用内存,最后将A一次性清除干净。

特点

  • 好处是没有碎片,复制过程中保证对象使用连续空间,且一次性清除所有垃圾,所以即使对象很多,收回效率也很高
  • 缺点是比较浪费内存,只能使用原来一半内存,因为内存对半划分了,复制过程毕竟也是有代价

算法总结

  • 效率: 复制算法>标记清除算法> 标记压缩算法
  • 内存整齐度: 复制算法=标记压缩算法> 标记清除算法
  • 内存利用率: 标记压缩算法=标记清除算法>复制算法
STW 问题

对于大多数垃圾回收算法而言,GC线程工作时,停止所有工作的线程,称为Stop The World。GC 完成 时,恢复其他工作线程运行

java 堆内存布局

Heap堆内存分为

  • 年轻代Young:Young Generation
    • 伊甸园区eden: 只有一个,刚刚创建的对象
    • 幸存(存活)区Servivor Space:有2个幸存区,一个是from区,一个是to区。大小相等、地位相同、可互换。
      • from 指的是本次复制数据的源区
      • to 指的是本次复制数据的目标区
  • 老年代Tenured:Old Generation, 长时间存活的对象

永久代:JDK1.7之前使用, 即Method Area方法区,保存JVM自身的类和方法,存储JAVA运行时的环境信息, JDK1.8后 改名为 MetaSpace,此空间不存在垃圾回收,关闭JVM会释放此区域内存,此空间物理上不属于 heap内存,但逻辑上存在于heap内存永久代必须指定大小限制,字符串常量JDK1.7存放在永久代,1.8后存放在heap中 MetaSpace 可以设置,也可不设置,无上限

规律: 一般情况99%的对象都是临时对象

Java 内存调整相关参数

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

选项分类

  • -选项名称 此为标准选项,所有HotSpot都支持
  • -X选项名称 此为稳定的非标准选项
  • -XX:选项名称 非标准的不稳定选项,下一个版本可能会取消

java -Xms1024m -Xmx1024m   -jar xxxx.jar

jvm 内存监控工具

JProfiler是一款功能强大的Java开发分析工具,它可以快速的帮助用户分析出存在的错误,软件还可对需 要的显示类进行标记,包括了内存的分配情况和信息的视图等

https://www.ej-technologies.com/products/jprofiler/overview.html

tomcat jvm 参数设置

默认不指定,-Xmx大约使用了1/4的内存,当前本机内存指定约为1G 在bin/catalina.sh中增加一行

......
# OS specific support. $var _must_ be set to either true or false.
#添加下面一行
JAVA_OPTS="-server -Xms128m -Xmx512m -XX:NewSize=48m -XX:MaxNewSize=200m"
                                                            
cygwin=false
darwin=false
........

-server:VM运行在server模式,为在服务器端最大化程序运行速度而优化
-client:VM运行在Client模式,为客户端环境减少启动时间而优化

垃圾回收策略

java8 年轻代 和 老年代 分别是不同的垃圾回收器

强调用户交互 ParNew + CMS

强调吞吐量 Parallel Scavenge + Parallel Old

java11起, 不在区分, 默认G1 垃圾回收器