JVM性能优化

匿名 (未验证) 提交于 2019-12-02 23:42:01

内存溢出

内存溢出的原因:程序在申请内存时,没有足够的内存空间

栈溢出

StackOverflowErrorOutOfMemoryError

堆溢出

OutOfMemoryError

直接内存

JVM

方法区溢出

ClassCGLIbJSP(JSPJava),OSGi()

内存泄漏

程序在申请内存后,无法释放已申请的内存空间。

ArrayList

IO

1.2.null

Java

解决方法:()

Hash

在集合中,如果修改了对象中的那些参与计算哈希值的字段,会导致无法从集合中单独删除当前对象,造成内存泄露

相同与不同:

:;

内存泄漏:该释放的对象没有释放,多见于自己使用容器保存元素的情况下。

如何避免:

内存溢出:检查代码以及设置足够的空间

内存泄漏:一定是代码有问题

往往很多情况下,内存溢出往往是内存泄漏造成的。

MAT

浅堆和深堆

:Shallow Heap324int4long88

GC直接间接访问到的所有对象的集合。通俗地说,就是指仅被对象所持有的对象的集合。深堆是指对象的保留集中所有的对象的浅堆大小之和。

ACDBEAAACD()AA+C+DEBA

incomingoutgoing

JDK

命令行工具

jps

JPS

进程

-m:. hello

-l: packagejar.

-v: jvm, -Xms20m -Xmx50mjvm

jstat

是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

假设需要每2501361610

常用参数:

-class ()

-compiler (JIT)

-gc (GC)

-gccapacity ()

-gccause (GC)

-gcnew ()

-gcnewcapacity ()

-gcold ()

-gcoldcapacity ()

-gcpermcapacity ()

-gcutil (GC)

-printcompilation (HotSpot)

jinfo

System.getProperties()

s

]

manageable

]

Thread.getAllStackTraces();

案例:JinfoTest

1.GC

2.jinfoGC

jmap

用于生成堆转储快照(一般称为heapdump或dump文件)。jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。和jinfo命令一样,jmap有不少功能在Windows平台下都是受限的,除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项都只能在Linux/Solaris下使用。

jmap -dump:live,format=b,file=heap.bin <pid>

Sun JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。

jhat

jhat dump文件名

Server is ready.http://localhost7000/

jhat1G

jstack

(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。

用java.lang.Thread类的getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成jstack的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。

可视化工具

JMXJava Management ExtensionsJavaJMX

管理远程进程需要在远程程序的启动参数中增加:

-Djava.rmi.server.hostname=…..

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=8888

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

Jconsole

visualvm

插件中心地址

https://visualvm.github.io

JDKvisualvm

一般来说,这个工具是本机调试用,一般生产上来说,你一般是用不了的(除非启用远程连接)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!