【一】java 虚拟机 监控示例 Eclipse Memory Analyser
1.堆内存溢出示例代码
import java.util.ArrayList;
import java.util.List;
public class TestHeap {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
while(true) {
list.add(new User()); }
}
}
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.chaoyijuechen.easypoi.TestHeap.main(TestHeap.java:10)

问:这是个小程序,可以快速定位内存溢出的位置,若是大应用中呢?代码上百万行,很难通过代码定位。这时该如何定位呢?
答:通过分析工具定位!
问:如何通过分析工具定位?
答:首先,将内存转储成一个快照,然后通过快照对当前环境进行分析。
问:如何生存快照?
答:通过Java虚拟机的参数设置!
-XX:+HeapDumpOnOutOfMemoryError 将Java堆内存溢出的堆存储快照dump
-vmargs //虚拟机设置
-Xms40m //初始内存
-Xmx256m //最大内存
-Xmn16m //最小内存
-XX:PermSize=128M //非堆内存
-XX:MaxPermSize=256M
最终会生成文件在项目根目录下:java_pid1124.hprof,内容如下: ( java version 1.8.0_181)
4a41 524f 4c45 2e30
2e31
7fe8 4b05 81d0
4c5f 4f4e
007f e84c 04c2 d073 756e 2f73
792f 706b 2f43 6f6e
6e74 496e 666f
45aa 4c6a 612f
696c 2f53 3c54 453b 3e3b 4c6a
612f 6c61 6e67 2f4f 626a 743b 406c 696e 6b4d 686f
1f00 007f e84a 41ec 106e
616d 6e64 496e 666f
4f66 1a00
007f e84b 84ab 6e27
206e 756c 6c01
001c 8fa0 416c
614e 756d 6e67
437a
4c6a 612f 6c61 6e67 2f43 6c61
3c2a 3e3b 4c6a 612f 6c61 6e67 2f43
6c61 3c2a 3e3b 295a
45b0 e028 4c6a
612f 6c61 6e67 2f53 696e 673b 5b4c
6a61 2f6c 616e 672f 6e67
3b4c 6a61 2f69 6f2f 6c65 3b29
..........
不同版本的jdk生存的快照文件可能不一样。 ( java version 1.8.0_144)

然后下载Eclipse Memory Analyer分析工具进行分析
【Mac版 Eclipse Memory Analyzer报错问题】MemoryAnalyzer-1.8.1.20180910-macosx.cocoa.x86_64.zip
下载后双击解压:在文件夹窗口的显示名称是mat,命令行中看名称是mat.App。鼠标双击mat,报如下错误错

查看此log文件
!SESSION -- ::43.357 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.8.0_181
java.vendor=Oracle Corporation
BootLoader constants: OS=macosx, ARCH=x86_64, WS=cocoa, NL=zh_CN
Framework arguments: -keyring /Users/guchunchao/.eclipse_keyring
Command-line arguments: -os macosx -ws cocoa -arch x86_64 -keyring /Users/guchunchao/.eclipse_keyring !ENTRY org.eclipse.osgi -- ::48.803
!MESSAGE Application error
!STACK
java.lang.IllegalStateException: The platform metadata area could not be written: /private/var/folders/37/y__4k3h10q77946z33vk7hqm0000gn/T/AppTranslocation/65F1F51A-AE28-408E-BD87-E0A4EAA7E11E/d/mat.app/Contents/MacOS/workspace/.metadata. By default the platform writes its content
under the current working directory when the platform is launched. Use the -data parameter to
specify a different content area for the platform.
at org.eclipse.core.internal.runtime.DataArea.assertLocationInitialized(DataArea.java:)
at org.eclipse.core.internal.runtime.DataArea.getStateLocation(DataArea.java:)
at org.eclipse.core.internal.preferences.InstancePreferences.getBaseLocation(InstancePreferences.java:)
at org.eclipse.core.internal.preferences.InstancePreferences.initializeChildren(InstancePreferences.java:)
at org.eclipse.core.internal.preferences.InstancePreferences.<init>(InstancePreferences.java:)
at org.eclipse.core.internal.preferences.InstancePreferences.internalCreate(InstancePreferences.java:)
at org.eclipse.core.internal.preferences.EclipsePreferences.create(EclipsePreferences.java:)
at org.eclipse.core.internal.preferences.EclipsePreferences.create(EclipsePreferences.java:)
at org.eclipse.core.internal.preferences.PreferencesService.createNode(PreferencesService.java:)
at org.eclipse.core.internal.preferences.RootPreferences.getChild(RootPreferences.java:)
at org.eclipse.core.internal.preferences.RootPreferences.getNode(RootPreferences.java:)
at org.eclipse.core.internal.preferences.RootPreferences.node(RootPreferences.java:)
at org.eclipse.core.internal.preferences.AbstractScope.getNode(AbstractScope.java:)
at org.eclipse.core.runtime.preferences.InstanceScope.getNode(InstanceScope.java:)
at org.eclipse.ui.preferences.ScopedPreferenceStore.getStorePreferences(ScopedPreferenceStore.java:)
at org.eclipse.ui.preferences.ScopedPreferenceStore.<init>(ScopedPreferenceStore.java:)
at org.eclipse.ui.plugin.AbstractUIPlugin.getPreferenceStore(AbstractUIPlugin.java:)
at org.eclipse.ui.internal.Workbench.lambda$(Workbench.java:)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:)
at org.eclipse.mat.ui.rcp.Application.start(Application.java:)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:)
at org.eclipse.equinox.launcher.Main.run(Main.java:)
原因:/private/var/folders/37/y__4k3h10q77946z33vk7hqm0000gn/T/AppTranslocation/65F1F51A-AE28-408E-BD87-E0A4EAA7E11E/d/mat.app/Contents/MacOS/workspace/.metadata文件是只读的。
解决方案:
1、新建/Users/guchunchao/eclipse-analyser-log 目录
2、重新定义log文件所在位置:打开mat.app/Contents/Eclipse/MemoryAnalyzer.ini,填入如下2行数据,位置一定要放在 --launcher.library之前
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-.jar
-data
/Users/guchunchao/eclipse-analyser-log
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.700.v20180518-
-vmargs
-Xmx1024m
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XstartOnFirstThread
将mat复制到【应用程序】中,这样就可以通过【启动台】点击打开了

图1

图2


【一】java 虚拟机 监控示例 Eclipse Memory Analyser的更多相关文章
- Java虚拟机监控命令
熟悉java的人都知道jdk的bin目录中有很多小工具,其中就包括用于监视虚拟机和故障处理的工具,今天就来仔细了解下各个工具的用法 jps JVM Process Status Tool,用于显示指定 ...
- jstat命令 -- Java虚拟机监控统计工具
http://blog.sina.com.cn/s/blog_5f5716580100u76r.html 语法:jstat [generalOption | outputOptions vmid [i ...
- Java虚拟机性能调优(一)
Java虚拟机监控与调优,借助Java自带分析工具. jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 jstat:JVM Statistics M ...
- Java虚拟机内存模型及垃圾回收监控调优
Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...
- 《深入理解Java虚拟机》-----第4章 虚拟机性能监控与故障处理工具
理论总是作为指导实践的工具,能把这些知识应用到实际工作中才是 我们的最终目的. 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异 ...
- Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行
通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...
- 虚拟机性能监控与故障处理工具(深入理解java虚拟机三)
JDK自带的工具可以方便的帮助我们处理一些问题,包括查看JVM参数,分析内存变化,查看内存区域,查看线程等信息. 我们熟悉的有java.exe,javac.exe,javap.exe(偶尔用),jps ...
- 深入理解JAVA虚拟机 虚拟机性能监控和故障处理工具
jre的bin目录下的工具,都非常小.它都是tools.jar下面的代码的一层封装而已.tools.jar不是java标准,是Hotspot实现的. 名称 作用 jps JVM Process Sta ...
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
随机推荐
- rt-thread中线程内置定时器的作用 ---
@2019-01-15 [小记] 常见到在内核组件的接口函数中,配置和启动一个定时器后,启动线程调度 我猜想是超时时间到达后恢复调用接口函数的线程以执行线程调度语句后的代码
- 每天一个linux命令(02):route命令
route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现. 在L ...
- JIRA和Confluence更改JVM内存大小解决访问打开缓慢问题
原因: 根据主机物理内存不同,默认的java虚拟机内存也会不同(一个较低值),有时候不够用,可以修改默认设置,改善内存不足导致的问题. 操作步骤: JIRA 1. 打开至相应目录: ~]# cd / ...
- Nginx宣布正式支持gRPC,附示例代码
原创 2018-03-20 薛命灯 聊聊架构 作者|Owen Garrett编辑|薛命灯 NGINX 官方博客正式宣布 NGINX 支持原生的 gPRC,现在就可以从代码仓库拉取快照版本.该特性将会被 ...
- docker 拷贝镜像文件
1.概述 我们制作好镜像后,有时需要将镜像复制到另一台服务器使用. 能达到以上目的有两种方式,一种是上传镜像到仓库中(本地或公共仓库),但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网的,所 ...
- Linux基本命令总结(三)
接上篇: 11,more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示 ...
- (三)orcale体系结构
https://www.cnblogs.com/chengxiao/p/5904783.html 一.什么是Oracle数据库? 众所周知,Oracle DataBase是一款关系型数据库管理系统(不 ...
- plink提取指定样本的数据(keep函数)
提取样本见命令行: plink --bfile file --noweb --keep sampleID.txt --recode --make-bed --out sample 其中,sampleI ...
- Ubuntu下添加Samba用户名与密码
参考: ubuntu下的Samba配置:使每个用户可以用自己的用户名和密码登录自己的home目录 增加samba用户提示Failed to add entry for user Ubuntu可以直接在 ...
- 安装webpack-dev-server始终不成功
先安装了webpack,后来安装webpack-dev-server会一直出现这个问题,我把webpack提示的1.0.0 , 2.0.0 ,3.0.0全都在全局装了一遍都没用,还是会出现这个问题.最 ...