如何做JVM调优

堆空间的参数设置

-Xms:初始堆空间内存(默认为物理内存的1/64)

-Xmx:最大堆空间内存(默认为物理内存的1/4)

-Xmn:m 新生代内存大小为m

-XX:NewRatio:4
表示新生代:老年代=1:4

-XX:SurvivorRatio:8
表示Eden:S0:S1=8:1:1

-verbose:class 在控制台打印类加载信息
-verbose:gc 在控制台打印垃圾回收日志

-XX:+PrintGC 打印GC日志,内容简单
-XX:+PrintGCDetails 打印GC日志,内容详细
-XX:+PrintGCDateStamps 在GC日志中添加时间戳

-Xloggc:filename 指定gc日志路径

JVM调优工具

1、jps:查看本机java进程信息。

2、jstack:打印线程的栈信息,制作线程dump文件。

3、jmap:打印内存映射,制作堆dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具

6、jconsole:简易的可视化控制台

7、jvisualvm:功能强大的控制台

jps(JVM process Status)

jps可以查看虚拟机启动的所有进程、执行主类的全名、JVM启动参数
比如当执行了JPSTest类中的main方法后(main方法持续执行),执行 jps -l可看到下面的JPSTest类的pid为31354,加上-v参数还可以看到JVM启动参数。

31354 com.danny.test.code.jvm.JPSTest

jstat(JVM Statistics Monitoring Tool)

jstat查看堆信息

jstat -gc pid 500 10 :每500毫秒打印一次Java堆状况
(各个区的容量、使用容量、gc时间等信息),打印10

jmap(Memory Map for Java)

jmap查看堆内存信息

jmap -histo pid:打印出当前堆中所有每个类的实例数量和内存占用,
jmap -dump 可以转储堆内存快照到指定文件

jconsole

jconsole分析内存信息(各个区如Eden、Survivor、Old等内存变化情况)

如何防止内存溢出

我们可以在以下这些方面努力:

自己写代码一定要注意:比如要避免死循环、防止递归爆栈、尽量避免长时间等待外部资源(数据库、网络、设备资源等)的情况

不要写多层循环,开发中见到有人写四层循环的,简直了。我的开发原则是最多两层,两层搞不定说明一定是哪里出问题了,一定是可以解决的,不能偷懒

-Xms和-Xmx的值设置成相等,也就是将初始堆内存和最大堆内存设置成一样,一开始就将最大的堆内存给jvm,尽可能减少内存溢出的风险。

新生代尽量设置大一些,让对象在新生代多存活一段时间,每次Minor GC 都要尽可能多的收集垃圾对象,防止或延迟对象进入老年代的机会,以减少应用程序发生Full GC的频率。

缩小对象的声明周期,比如能定义在方法中就不要定义在方法外面。

避免创建过大的对象及数组
过大的对象或数组在新生代没有足够空间容纳时会直接进入老年代,如果是短命的大对象,会提前触发Full GC。

避免同时加载大量数据
可以分批读取,用完尽快清空引用。

当集合中有对象的引用,这些对象使用完之后要尽快把集合中的引用清空,这些无用对象尽快回收避免进入老年代。

如果不能及时返回结果可以适当采用异步处理的方式等。

参考:
添加链接描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值