java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是由类加载器一步步解析, 执行与生成与内存区域中的; 并且jvm有自己的垃圾回收器对内存区域管理, 回收; 但是我们已经可以通过一些工具来在程序运行时查看对应的jvm内存使用情况, 帮助更好的分析与优化我们的代码;


注: 查看系统里java进程信息

// 查看当前机器上所有运行的java进程名称与pid(进程编号)
jps -l
// 显示指定的jvm进程所有的属性设置和配置参数
jinfo pid

1 . jmap : 内存占用情况查询 (位于”jdk_home/bin”目录下)

// 查询某个pid进程对应的应用程序内存占用情况
jmap -heap pid// 示例
jmap -heap 5940
Attaching to process ID 5940, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14using thread-local object allocation.
Parallel GC with 4 thread(s)Heap Configuration:MinHeapFreeRatio         = 0MaxHeapFreeRatio         = 100MaxHeapSize              = 734003200 (700.0MB)NewSize                  = 44040192 (42.0MB)MaxNewSize               = 244318208 (233.0MB)OldSize                  = 88080384 (84.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
PS Young Generation
Eden Space:capacity = 32505856 (31.0MB)used     = 13906760 (13.262519836425781MB)free     = 18599096 (17.73748016357422MB)42.782322052986395% used
From Space:capacity = 6291456 (6.0MB)used     = 294912 (0.28125MB)free     = 5996544 (5.71875MB)4.6875% used
To Space:capacity = 7340032 (7.0MB)used     = 0 (0.0MB)free     = 7340032 (7.0MB)0.0% used
PS Old Generationcapacity = 41943040 (40.0MB)used     = 6127536 (5.8436737060546875MB)free     = 35815504 (34.15632629394531MB)14.609184265136719% used8535 interned Strings occupying 710344 bytes.

2 . jstack : 进程所包含线程情况查询 (位于”jdk_home/bin”目录下)

// 命令帮助
jstach -h
// 显示进程详情
jstack pid// 示例
jstach 5940
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.92-b14 mixed mode):"RMI TCP Connection(10)-10.2.13.162" #32 daemon prio=5 os_prio=0 tid=0x00000000179dc000 nid=0x1f60 in Object.wait() [0x000000001d7dd000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)at com.sun.jmx.remote.internal.ArrayNotificationBuffer.fetchNotifications(ArrayNotificationBuffer.java:449)- locked <0x00000000d462ec18> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer)at com.sun.jmx.remote.internal.ArrayNotificationBuffer$ShareBuffer.fetchNotifications(ArrayNotificationBuffer.java:227)at com.sun.jmx.remote.internal.ServerNotifForwarder.fetchNotifs(ServerNotifForwarder.java:274)at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1270)at javax.management.remote.rmi.RMIConnectionImpl$4.run(RMIConnectionImpl.java:1268)at javax.management.remote.rmi.RMIConnectionImpl.fetchNotifications(RMIConnectionImpl.java:1274)at sun.reflect.GeneratedMethodAccessor59.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324).............."GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002d10000 nid=0x27dc runnable"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002d11800 nid=0x2d84 runnable"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002d13800 nid=0x118 runnable"VM Periodic Task Thread" os_prio=2 tid=0x0000000015ccb000 nid=0x2fd4 waiting on conditionJNI global references: 239

3 . jstat: 可以实时监测系统资源占用与jvm运行情况 (位于”jdk_home/bin”目录下)

// 命令语法结构:
Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

// 参数解释:
Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid    — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count   — 打印次数,如果缺省则打印无数次S0  — Heap上的 Survivor space 0 区已使用空间的百分比
S1  — Heap上的 Survivor space 1 区已使用空间的百分比
E   — Heap上的 Eden space 区已使用空间的百分比
O   — Heap上的 Old space 区已使用空间的百分比
P   — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

//示例
jstat -options-class
    -compiler
    -gc
    -gccapacity
    -gccause
    -gcmetacapacity
    -gcnew
    -gcnewcapacity
    -gcold
    -gcoldcapacity
    -gcutil
    -printcompilation

jstat -class -t 5940
Timestamp Loaded  Bytes  Unloaded  Bytes     Time
6188.4   3898  7178.4       40    58.3       1.78jstat -gcutil 5940 1000 5
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00  25.00  98.55  15.37  96.94  94.88     21    0.069     7    0.237    0.306
0.00  25.00  99.59  15.37  96.94  94.88     21    0.069     7    0.237    0.306
0.00  25.00  99.59  15.37  96.94  94.88     21    0.069     7    0.237    0.306
0.00  25.00 100.00  15.37  96.94  94.88     21    0.069     7    0.237    0.306
0.00  25.00 100.00  15.37  96.94  94.88     21    0.069     7    0.237    0.306

4 . jconsole 以GUI的方式更直观化呈现jvm进程的实时情况, 比如内存占用, 线程执行情况等;
在jdk_home/bin目录下执行 jconsole.exe 打开图形化界面, 然后选择要检查的进程就可以查看所有相关jvm情况的信息了.

5 . jprofiler 一个付费的商业jvm分析监控工具, 可查看概况, 内存, GC活动, class 状况, 线程信息, CPU 占用情况, 内存对象信息, 还有数据库连接等, 是一个非常优秀的分析工具;

JVM运行时内存使用情况监控相关推荐

  1. [转]JVM运行时内存结构

    [转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...

  2. JVM运行时内存概念-堆栈及新生代、老年代、持久代

    JVM内存有一些按不同标准划分的概念,这里来理清一下. 一.首先java虚拟机规范定义了java运行时数据区在概念上应该有的分区,这是抽象概念不对应也不限制物理上的具体实现,不同的虚拟机可以有不同的实 ...

  3. 尝试用HSDB分析JVM运行时内存理解Java多态实现机制

    测试代码 // 接口 package ziya; public interface TestParent {void show(); }package ziya; public class Paren ...

  4. java runtime类 heap_Java 进阶(一) JVM运行时内存模型

    1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果 ...

  5. 在没有任何数据时进行无效的读取尝试。_技术转载——JVM运行时内存是怎么分布的?...

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/ ...

  6. JVM运行时内存分区

    什么是JVM?JVM概述--初识JVM(类加载器,垃圾回收器,执行引擎) 上一篇博客我们对jvm以及它的三个"部件"有了初步的认识,这一篇我们探讨一下源码经过编译.加载后这些数据被 ...

  7. 三年Java开发,你连基础的JVM运行时内存布局都忘了

    面:为什么要使用双亲委派机制去加载类? 答:避免多份同样字节码的加载,浪费内存. 类的加载方式 隐式加载:new 显示加载:loadClass.forName等 类的装载过程如下图: 面:loadCl ...

  8. JVM 运行时内存空间详解——元空间

    通过上一篇文章,我们大体了解了JVM的整体架构,其分为:元数据(JDK7是方法区).堆.虚拟机栈.本地方法栈.程序计数器几个部分. 本篇文章,咱们对元空间进行剖析,一探究竟. 1. 元空间介绍 在JD ...

  9. JVM运行时内存结构学习

    学习JVM运行模型比较重要,先看一幅图片: 运行时数据区(内存结构) :  1.方法区(Method Area) 类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义.简单来说, ...

最新文章

  1. Robotics Research Laboratory
  2. 经验总结02-sql语句
  3. 聊聊成为大神路上的过程
  4. 国家集训队 小Z的袜子
  5. gram矩阵_推荐算法三视角:矩阵,图,时间线
  6. Classification分类halcon算子,持续更新
  7. CSS实现响应式布局(自动拆分几列)
  8. homebrew mysql conf_homebrew 安装mysql后,如何配置mysql
  9. 打造大数据和AI能力底座 联通大数据深度参与“新基建”
  10. linux启动脚本添加命令,Linux添加shell(.sh)脚本并添加定时任务
  11. 【算法】剑指 Offer 47. 礼物的最大价值
  12. 计算机cmos芯片用途,什么是CMOS,它有什么用途?
  13. python正则表达式笔记之字符集合的使用
  14. Oracle开发技能提升之层次查询全面解析
  15. POSIX XSI
  16. MATLAB实现SVM多分类(one-vs-rest),利用自带函数fitcsvm
  17. ubuntu实用工具
  18. Microsoft FxCop 的设计规则 .
  19. 列表的join方法,类方法formkeys,删除,集合,深浅拷贝赋值,冒泡排序
  20. 统计200~1000之间能被7整除数的个数。

热门文章

  1. excel有的单元文字可以超出单元格_excel表格里的文字超出单元格如何解决
  2. Axure RP9 页面弹窗效果
  3. 手把手教你迁移微信小程序到 QQ 浏览器!
  4. Revit问题:创建牛腿柱和快速生成圈梁
  5. 仿京细菜谱微信小程序源码/云开发菜谱微信小程序源码
  6. Oracle认证考试介绍
  7. R的32位与64位的区别!
  8. eclipse快捷键(定位函数,查找类,查找方法)
  9. python可以做硬件吗_Micropython让你会python就能做硬件
  10. Vue ElementUI表格内实现图片点击放大效果的方式