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

6 篇文章 0 订阅
5 篇文章 0 订阅

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连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值