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堆内存分为

永久代: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

选项分类

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 垃圾回收器