⑴ 如何在eclipse mp java内存占用情况和打印GC LOG
一、下载MAT
二、测试代码如下:
packagecom.memoryLeakAnalysis;
importjava.util.ArrayList;
importjava.util.List;
publicclassMemoryLeakDemo{
publicstaticvoidmain(String[]args){
List<String>list=newArrayList<String>();
while(true){
list.add("OutOfMemoryErrorsoon");
}
}
}
⑵ mp内存format b什么意思
其中jmap是java自带的工具查看整个JVM内存状态jmap-heap[pid]要注意的是在使用CMSGC情况下,jmap-heap的执行有可能会导致JAVA进程挂起查看JVM堆中对象详细占用情况jmap-histo[pid]导出整个JVM中内存信息jmap-mp:format=b,file=文件名[pid]jhat是sun1.6及以上版本中自带的一个用于分析JVM堆DUMP文件的工具,基于此工具可分析JVMHEAP中对象的内存占用情况jhat-J-Xmx1024M[file]执行后等待console中输入startHTTPserveronport7000即可使用浏览器访问IP:提供的一个用于分析JVM堆Dump文件的插件。借助这个插件可查看对象的内存占用状况,引用关系,分析内存泄露等。kill-3[pid]在Linux上找到Java所在的进程号,然后执行以上命令,线程的相关信息就输出到consolejstackjstack是sunJDK自带的工具,通过该工具可以看到JVM中线程的运行状况,包括锁等待,线程是否在运行执行jstack[pid],线程的所有堆栈信息"http-8080-10"daemonprio=10tid=x0a949bb60nid=0x884waitingformonitorentry[]"http-8080-10"这个线程处于等待状态。waitingformonitorentry如果在连续几次输出线程堆栈信息都存在于同一个或多个线程上时,则说明系统中有锁竞争激烈,死锁,或锁饿死的想象。“http-8080-11”daemonprio=10tix=xxxnid=xxxinobject.wait()[]java.lang.Thread.State:waiting(onobjectmonitor)该表示http-8080-11的线程处于对象的Wait上,等待其他线程的唤醒,这也是线程池的常见用法。“LowMemoryDetector”daemonprio=10tix=xxnid=xxxrunnable[]java.lang.Thread.State:runnable表示“LowMemoryDetector”的线程处于Runable状态,等待获取CPU的使用权.参考:/blog/static/100768914201242410583187/jvisualvm一.JavaVisualVM概述对于使用命令行远程监控jvm太麻烦。在jdk1.6中Oracle提供了一个新的可视化的。JVM监控工具JavaVisualVM。jvisualvm.exe在JDK的bin目录下。双击启动JavaVisualVM后可以看到窗口左侧“应用程序”栏中有“本地”、“远程”、“快照”三个项目。“本地”下显示的是在localhost运行的Java程序的资源占用情况,如果本地有Java程序在运行的话启动JavaVisualVM即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的CPU、Heap、PermGen、类、线程的统计信息。“远程”项下列出的远程主机上的Java程序的资源占用情况,但需要在远程主机上运行jstatd守护程序VisualVM分为3类,本地它会自动侦测到,并显示出来双击Local下的任一节点,看到右边的变化,你可以监控CPU,内存,类,线程等运行状况,实时监控服务器性能。右键VisualVM我们可以看到ThreadDump,HeapDump做ThreadDump很快,马上就可以看到结果HeapDump要稍花费一些时间(可以看到当前heap里对象的数量及占用的比例,做OOM很好用)对其功能不再做描述,可以查阅网上相关质量,我们主要讲的是如何使用VisualVM远程监控。
⑶ 如何通过mat从java内存mp中找到缓存对象中的所有字符串
生成java内存mp文件
标准做法,jmap mp,需要sudo权限,另外jmap指定的mp文件一定要是启动服务的用户可写,比如可以新创建一个文件夹
sudo mkdir /home/q/memmp
sudo chown resin:resin /home/q/memmp
sudo -u resin /home/q/java/default/bin/jmap -mp:live,format=b,file=/home/q/memmp/memMap.20130527.hprof ${pid}
把mp文件拿到本地
把mp文件压缩下,否则会很大,scp到本地
安装mat
直接在eclipse里:
1.Help->Install New Software
2.输入update site: http://download.eclipse.org/mat/1.2/update-site/,然后一直next就行了,安装完重启eclipse
3.最好创建一个单独的workspace来放内存mp文件
把mp文件导入mat
1.打开eclipse,选择上一步你创建的存放内存mp文件的workspace,我本机上是~/mat
2.打开刚才拿到本地的mp文件,然后等着mat解析就完了,注意这时候你可能需要修改eclipse安装文件下的eclipse.ini,调整下eclipse的jvm参数(xms和xmx),把heap调大些,否则解析过程会报OOM
3.解析完后会生成一个Overview,我们一般会选择org.apache.catalina.loader.WebappClassLoader,作为分析top
consumer的切入点,这是tomcat上web应用的classloader
4.单击饼图上org.apache.catalina.loader.WebappClassLoader的区域,会出现一个弹出菜单,选择List
Objects->with incoming references,因为所有的web应用内的对象都会引用它们自己的class
loader,也就是org.apache.catalina.loader.WebappClassLoader
5.得到如下所示列表,单击retained heap这个tab标签可以排序,选择按照占用内存的大小倒排序,得到了top memory
consumers列表
定位缓存对象
我们关心的是top consumer里的RtTreeCache里,有多少重复房型,怎么得到的呢,follow the steps:
1.查看RtTreeCache对象的outgoing
reference,因为我们需要看这个对象里面的属性,属性对象也就是RtTreeCache对象引用的对象,也就是outgoing reference
2.找到我们需要分析的数据在对象结构中的位置
3.可以看到我们要查找的目标是RtTreeCache对象下的所有HotelRtTree对象的rtReverseMap对象属性下的table数组内所有entry的key,我们接下来就看看怎么把这个冗长的关系转化成一个简单的OQL语句
写MAT OQL
OQL是MAT里的一个内嵌查询语言,它的官方描述很形象:
Memory Analyzer has a built-in object query
language (OQL) that allows to query the heap mp with custom SQL-like queries. Just
think of classes as tables, objects as rows, and fields as columns.
总结
jmap + mat是我们分析java内存的利器,而通过mat
oql,我们可以从mp文件里提取出更多的类似于有多少内容相同的不同字符串对象等信息来帮助我们做技术决策。
⑷ 如何分析jvm mp 内存日志
当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(Thread Dump)用于后续的分析.
Thread mp提供了当前活动的线程的快照. 它提供了JVM中所有Java线程的栈跟踪信息
有很多方式可用于获取Thread Dump, 一些是操作系统特定的命令.
操作系统命令获取ThreadDump:
Windows:
1. 转向服务器的标准输出窗口并按下Control + Break组合键, 之后需要将线程堆栈复制到文件中
UNIX/ Linux
首先查找到服务器的进程号(process id), 然后获取堆栈.
1. ps –ef | grep java
2. kill -3
注意一定要谨慎, 一步不慎就可能让服务器进程被杀死!
JVM 自带的工具获取线程堆栈:
JDK自带命令行工具获取PID并做ThreadDump:
1. jps
2. jstack
使用JVisualVM:
Threads 标签页àThreadDump按钮.
WebLogic 自带的获取 thread mp的工具:
1. webLogic.Admin 工具
a. 打开命令提示符, 通过运行/bin/setDomain.env设置相关类路径
b. 执行下面的命令
java weblogic.Admin -url t3://localhost:7001 -username weblogic -password weblogic1 THREAD_DUMP
注意: Thread Dump 会打印到标准输出, 如nohup日志或者进程窗口.
2. 使用 Admin Console
a. 登录 Admin Console , 点击对应的服务器
b. 点击Server à Monitoring àThreads
c. 点击: Dump Thread Stack 按钮
3. 使用WLST (WebLogic Scripting Tool)
connect(‘weblogic’,'weblogic1’,’t3://localhost:7001’)
cd(‘Servers’)
cd(‘AdminServer’)
threadDump()
disconnect()
exit()
注意: 线程堆栈将会保存在运行wlst的当前目录下.
4. 使用utils.ThreadDumper
用法:
C:\bea\wlserver_10.3\server\lib>java -cp weblogic.jar utils.ThreadDumper
Broadcast Thread mps disabled: must specify weblogic.debug.mpThreadAddr and
weblogic.debug.mpThreadPort
Exception in thread "main" java.lang.I llegalArgumentException: Port out of range
:-1
at java.net.DatagramPacket.setPort(Unknown Source)
at java.net.DatagramPacket.(Unknown Source)
at java.net.DatagramPacket.(Unknown Source)
at utils.ThreadDumper.sendDumpMsg(ThreadDumper.java:124)
at utils.ThreadDumper.main(ThreadDumper.java:145)
5. 如果服务器是作为Windows服务的方式运行, 请运行下列命令:
WL_HOME\bin\beasvc -mp -svcname:service-name
⑸ 宕机的时候,java mp 是什么东西这句话又是什么意思
对于大型 java 应用程序来说,再精细的测试都难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的运行状态并将其存储在转储(mp)文件中,从而为我们分析和诊断问题提供了重要的依据。常见的转储文件包括 Java Dump, Heap mp 和 System mp。
⑹ 如何排查Java内存泄露
1.打开/tomcat_home/bin/catalina.bat文件
2.加上:set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:heapmp,这样当内存溢出是就会在对应路径下生成mp文件
⑺ 请教java堆内存mp文件太大,如何打开
服务器是64位的?貌似都不怎么推荐用64位的jdk。
这个只有找64位机子上面看了,把xmx设置大些。32位机子上面的内存使用只有3g左右,不会超过mp文件的3.8g的。
⑻ 什么是java mp文件 怎么生成
java mp heap 是分配给实例类和数组对象运行数据区,所有java线程在运行期间共享heap中的数据。Java heap mp相当于java应用在运行的时候在某个时间点上打了个快照(snapshot)。
有java mp文件生成的方式如下:
1.使用$JAVA_HOME/bin/jmap -mp来触发,eg:jmap -mp:format=b,file=/home/longhao/heammp.out
2.使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>mpHeap中,点击 mpHeap按钮。生成的mp文件在java应用的根目录下面。
3.在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成mp文件。
4.使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。
⑼ java visualvm 堆mp怎么分析
jmap是java自带的工具
1. 查看整个JVM内存状态
jmap -heap [pid]
2. 查看JVM堆中对象详细占用情况
jmap -histo [pid]
3. 导出整个JVM 中内存信息,可以利用其它工具打开mp文件分析,例如jdk自带的visualvm工具
jmap -mp:file=文件名.mp [pid]