JVM运行参数

常见标准参数

  • -showversion: 显示当前JVM版本等信息
  • -D设置系统属性参数:
/*** 测试* @author regotto*/
public class JvmTest {public static void main(String[] args) {//获取系统参数String str = System.getProperty("str");System.out.println(str);}
}

在IDEA的运行配置环境中添加VM options

运行结果: hello

  • server, client参数
server: 初始堆空间大, 并行垃圾回收, 启动慢, 运行快
client: 初始堆空间小, 串行垃圾回收, 启动快, 运行慢
默认64操作系统只有server类型

常见-X非标准参数

  • -Xint: 强制JVM执行所有字节码, 运行速度降低较为严重
  • -Xcomp: 与Xint相反, JVM第一次使用把所有的字节码编译生成本地代码, 提高代码优化程度(-Xcomp没有让JVM启用JIT编译器全部功能, JIT可以自行决定哪些代码编译, 哪些代码不编译), 也存在运行速度下降, 相比于Xint, -Xcomp较好
  • -Xmixed: 解释模式与编译模式的混合, 让JVM自行决定使用哪种方式进行编译

常见-XX非标准参数(常用于JVM调优/debug操作)

boolean类型: -XX:[+-]<name> +表示启用属性, -表示禁用属性例: -XX:+DisableExplicitGC 禁止手动调用GC
非boolean类型:-XX:<name>=<value> 设置name值为value例: -XX:NewRatio=1 设置新老代比值
  • -Xms: 设置jvm的堆内存大小, 例: -Xms512m 等价于 -XX: InitialHeapSize=512m
  • -Xmx: 设置堆内存最大值, 例: -Xmx2048m 等价于 -XX: MaxHeapSize=2048m

查看JVM运行参数

  • 运行时打印参数: -XX:+PrintFlagsFinal

    查询打印的运行参数如下:
    根据上图, 等号后面是数字 => 非boolean类型-XX参数; 等号后面是true/false => boolean类型-XX:参数; =, :=代表默认值与被修改的值
  • 查看正在运行的JVM参数: jinfo -flags 进程端口; 查看指定属性的值: jinfo -flags 属性 进程端口

JVM内存模型

1.7版本与1.8版本内存模型

各区域说明

Young: 年轻代=> 包含Eden, 2*Survivor, 其中一个Survivor用于存放GC时存活的对象, 经历几次垃圾回收, Survivor中存活对象转移到Tenured
Tenured: 老年代存放生命周期长的对象, 对象在Young中区域中, 经历多次GC都还存活, 才能转移到Tenured, 当生产一个大对象时, 会直接移动到老年代中
Perm: 1.7版本, 保存class, method, field对象. 很少出现OOM
MetaspaceVM: 1.8版本, 使用元数据空间替换Perm区, 存放位置放置在直接内存中, 不再占用虚拟机空间
Virtual: 最大内存与初始内存的差值

弃用1.7Perm永久区说明

根据官方说明: 融合HotSpot, JRockit(不存在永久代), 且永久代容易出现OOM

jstat使用

jstat: 用于查询堆内存各部分使用情况, 加载类数量

Loaded: 加载class数量    Bytes: 占用空间大小   Unloaded: 未加载数量 Bytes: 未加载空间    Time: 时间

查看当前应用编译情况

Compiled:编译数量。 Failed:失败数量 Invalid:不可用数量 Time:时间 FailedType:失败类型 FailedMethod:失败的方法

查看当前应用GC情况

S0C:第一个Survivor区的大小(KB) S1C:第二个Survivor区的大小(KB) S0U:第一个Survivor区的使用大小(KB) S1U:第二个Survivor区的使用大小(KB)
EC:Eden区的大小(KB) EU:Eden区的使用大小(KB) OC:Old区大小(KB) OU:Old使用大小(KB)
MC:方法区大小(KB) MU:方法区使用大小(KB) CCSC:压缩类空间大小(KB) CCSU:压缩类空间使用大小(KB)
YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

动态查看应用运行情况: jstat -gc 13880 1000 5 => 每隔1s打印一次, 总共打印5次

jmap使用

jmap: 相比于jstat, jmap能获取更加详细的内容
查看当前应用堆情况:

查看应用存活对象:

jmap -histo 105772 代表查看所有对象, 包括死亡的对象

对象说明:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[] [L+类名 其他对象

将内存使用情况dump到文件中, jhat对dump文件分析

jmap -dump:format=b, file=dumpFileName 应用端口

jhat -port 端口 dump文件

可以对上面的内容进行检查, 快速定位分析问题, 哪个地方有大对象产生, 那个地方的内存分配不合理等情况

模拟内存溢出, 使用Eclipse Memory Analyzer进行分析

import java.util.ArrayList;
import java.util.UUID;/*** 内存溢出测试* @author regotto*/
public class JvmTestOutOfMemarry {public static void main(String[] args) {ArrayList<String> strings = new ArrayList<String>();for (int i = 0; i < 10000000; i++) {String s = "";for (int j = 0; j < 10000; j++) {s += UUID.randomUUID().toString();}strings.add(s);}System.out.println("Ok");}}


-XX:HeapDumpOnOutOfMemoryError: 设置程序内存溢出时, 自动生成dump文件

将在项目下生成的java_pid175420.hprof导入Eclipse Memory Analyzer工具

查看分析报告: 在main函数中, 存在本地变量占用73.09%的内存空间, 点击see stacktrace查看线程栈调用情况, 如下图, 可以看出StringBuilder.append导致内存溢出情况

jstack查看jvm线程情况

jstack pid

Java VisualVM

使用方式 => 自行百度
注: 监控远程服务器上的程序, 需要配置JMX才能进行JMX连接

JVM运行参数_JVM内存模型_常用内存分析工具相关推荐

  1. JVM内存模型 和 Java内存模型 对比学习

    前言 首先要知道这两者不是同一个东西,Jvm内存模型 也叫 Java内存区域.Java运行时数据区域 而Java内存模型 是 JMM (Java Memory Model,简称 JMM),是定义了线程 ...

  2. 全面理解java内存模型_深入理解Java内存模型(八)——总结

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JVM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JVM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  3. JVM内存模型、Java内存模型 和 Java对象模型

    一.JVM内存模型 1.JVM运行时数据区 二.Java内存模型(JMM) 1.JMM 三.Java对象模型 1.Java对象在JVM中的存储模型称之为Java对象模型.  四.总结  1.JVM内存 ...

  4. java线程内存模型_深度解析Java多线程的内存模型

    内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操 ...

  5. Java内存模型_基础

    线程之间的通信机制有两种: 1.共享内存:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式的通信. 2.消息传递:线程之间没有公共状态,线程之间必须发送消息来显示的进行通信 同步:是指程 ...

  6. idea设置JVM运行参数

    对JVM运行参数进行修改是JVM性能调优的重要手段,下面介绍在应用程序开发过程中JVM参数设置的几种方式. 方式一 java程序运行时指定 -Dproperty=value 该参数通常用于设置系统级全 ...

  7. C++_程序内存模型_内存四区_代码区_全局区_每种区域都存放什么样的变量---C++语言工作笔记028

    然后我们再来看,c++的内存模型,中的四个区域. 代码区放函数体的二进制形式的代码,由操作系统管理 全局区,放全局变量和静态变量,以及常量 栈区,由编译器自动分配释放,存放函数的参数值,局部变量 堆区 ...

  8. java ps old gen perm gen_Java 内存模型之堆内存管理

    Java 内存模型之堆内存(Heap) 一.背景知识:内存类型介绍 1.什么是 Perm Gen? Perm Gen : Permanent Generation Perm Gen 区是一个特殊的JV ...

  9. JUC多线程:JMM内存模型与volatile内存语义

    一.JMM 内存模型: 1.什么是 JMM 内存模型: Java 内存模型是 Java 虚拟机定义的一种多线程访问 Java 内存各个变量的访问规范,主要围绕如何解决并发过程中的原子性.可见性.有序性 ...

最新文章

  1. ​20210716未来智能实验室收录资料
  2. 菜鸟教程 php跨域,PHP Ajax 跨域问题最佳解决方案
  3. PHP 设计模式系列 —— 资源库模式(Repository)
  4. 北京沙龙报名 | 关于Dubbo开源的那些事儿
  5. gatsby_使用TinaCMS + Gatsby编辑Markdown的3种方法
  6. 【转】Go Micro(2)——微服务工具箱
  7. 零基础学python看什么书好?
  8. win7服务器 能否建立多个网站,windows7下weblogic10.3服务器下一个domain建多个server(端口)...
  9. [转载] Python导出Excel图表
  10. 【Teradata】系统吞吐量重要参数QPS(TPS)、并发数、响应时间
  11. [转载]测试程序执行时间
  12. Linux基础知识--Linux分区
  13. proteus元件图片_最完整的Proteus元件库元件名称及中英对照表下载
  14. 手机蓝牙连接51单片机自动开门
  15. DP动态规划--m处理器问题- m processors(FZU - 1442)
  16. 01赵玉荣-03安海莹-04郝玥-实训一
  17. 国产系统UOS上的视频监控系统
  18. php 微信token验证失败,php下微信token验证失败怎么办?
  19. php爬虫教程(一) 简单的页面抓取
  20. PS人物头发抠取教程 PS照片换背景方法

热门文章

  1. 《我也能做CTO之.程序员职业规划》 水准之上,期望以下
  2. 股票代码前面为0,补齐6位数
  3. 合并分ER图产生的冲突
  4. 32--数组中重复的数字
  5. tp5 linux路由不跳转,thinkphp5路由不生效一直跳到首页的解决方法
  6. python 打包exe_python如何封装为exe
  7. 【深度学习】TensorFlow之卷积神经网络
  8. 执行Hive语句报错:FAILED: Error in metadata: javax.jdo.JDOFatalDataStoreException: Access denied for user '
  9. 网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字
  10. oracle闪回某个时间点的数据库,oracle11g 使用闪回查询恢复表到过去某一个时间点...