免费做网站软件,西安注册公司代理,网站建设的必要性分析,廊坊seo优化公司一、jvm的运行参数 标准参数 -help、-version、-D参数
jvm的标准参数#xff0c;一般都是很稳定的#xff0c;在未来的JVM版本中不会改变#xff0c;可以使用java -help 检索出所有的标准参数。 通过以下命令查看#xff1a;
命令#xff1a;java -help 可以看到我们经常…一、jvm的运行参数 标准参数 -help、-version、-D参数
jvm的标准参数一般都是很稳定的在未来的JVM版本中不会改变可以使用java -help 检索出所有的标准参数。 通过以下命令查看
命令java -help 可以看到我们经常会用到的 -sever-version等参数。 实战1查看JVM版本
命令java -version jvm版本是1.8.0_202而且是64位server混合模式。 实战2通过-D设置系统属性参数
先写一段代码
public class TestVM { public static void main(String[] args) { String name System.getProperty(name); if(name!null){ System.out.println(name); } else{ System.out.println(ling); } }
}
运行上面这段代码通过-D带入一个参数name根据name的值进行判断如果name不为null则打印如果为null则打印 ling。
# 在root下创建一个文件夹下创建这个文件
vi TestJVM.java#把上面的java代码复制进去#执行代码
[rootlocalhost test]# javac TestJVM.java
[rootlocalhost test]# java TestJVM
ling#设置参数进行设置系统属性‐D名称值
[rootlocalhost test]# java -Dnamesmart哥
smart哥 -server、-client参数 -X参数非标准参数
jvm的-X参数是非标准参数在不同版本的jvm中参数可能会有所不同可以通过java -X查看非标准参数。 -XX参数使用率较高 -Xms与-Xmx参数 查看jvm的运行参数 jinfo是JDK自带的一种命令行工具用于查看和修改Java应用程序的运行参数。它可以帮助开发人员在运行时调整JVM参数例如堆大小、GC收集器、线程栈大小等 查Java进程25834的JVM参数
命令jinfo -flags 25834 Non-default VM flags:非标准参数
Command line: 通过命令行设置的参数 查Java进程25834的单个JVM参数
命令jinfo -flag ConcGCThreads 25834 jvm内存模型详解
jvm的内存模型在1.7和1.8有较大的区别虽然本套课程是以1.8为例进行讲解但是我们也是需要对1.7的内存模型有所了解所以接下里我们将先学习1.7再学习1.8的内存模型。目前线上常用版本组合是jdk8tomcat8.5。 jdk1.7的堆内存模型 fullGC - 回收整个堆内存(年轻代、老年代) jdk1.8的堆内存模型
JVM1.7和1.8的最大差异1.7的永久区在堆内存(虚拟机)中1.8永久区被废弃加入了MetaData位于机器直接内存内存条中不在虚拟机中 为什么要废弃1.7中的永久区
可能理由永久区管理字节码文件一般情况下增加字节码文件都会重启虚拟机运行中垃圾回收期基本不用管理字节码文件只有热部署的时候永久区才会断追加字节码文件这也就是为什么热部署容易报java.lang.OutOfMemoryError:PermGen space,也可能是导致永久区不再需要被虚拟机管理在1.8被移除的一个重要原因将字节码文件直接放入机器本地内存空间中(MetaData)。 通过jstat命令进行查看堆内存使用情况
jstat命令可以查看堆内存各部分的使用量以及加载类的数量。
命令的格式如下
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 查看class加载数统计
命令jstat -class 3694 查看编译统计
命令jstat -compiler 3694 垃圾回收统计
命令jstat -gc 3694 查看进程11005的GC信息 间隔1秒1次打印5次
命令jstat -gc 11005 1000 5 jmap使用以及内存溢出分析jmap命令用的比较多
前面通过jstat可以对jvm堆的内存进行统计分析而jmap可以获取到更加详细的内容。如内存使用情况的汇总、对内存溢出的定位与分析。 查看内存使用情况
命令jmap -heap 3694 解释 Java命令学习系列三——Jmap -腾讯云开发者社区-腾讯云 查询内存中对象数量及大小
命令jmap -histo 3331 查询内存中活跃的对象数量及大小
命令jmap -histo:live 25834| more 将内存使用情况dump到文件中 通过浏览器访问解析后的文件
http://localhost:8888 如果有防火墙开放8889端口 jhat还提供了查询功能在页面的最后面 MAT工具使用详解 MAT工具介绍
MAT(Memory Analyzer Tool)一个基于Eclipse的内存分析工具是一个快速、功能丰富的JAVA heap分析工具它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析快速的计算出在内存中对象的占用大小看看是谁阻止了垃圾收集器的回收工作并可以通过报表直观的查看到可能造成这种结果的对象。 下载安装
旧版本下载地址Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation 使用 内存溢出定位与分析实战
内存溢出在实际的生产环境中经常会遇到比如不断的将数据写入到一个集合中出 现了死循环读取超大的文件等等都可能会造成内存溢出。
如果出现了内存溢出首先我们需要定位到发生内存溢出的环节并且进行分析是正 常还是非正常情况如果是正常的需求就应该考虑加大内存的设置如果是非正常需求那么就要对代码进行修改修复这个bug我们需要借助于jmap与MAT工具进行定位分析。
接下来我们模拟内存溢出的场景。
1、模拟内存溢出
编写代码向List集合中添加100万个字符串每个字符串由1000个UUID组成。如果程序能够正常执行最后打印okidea编辑器中需要设置内存溢出相关参数
#参数如下
‐Xms8m ‐Xmx8m ‐XX:HeapDumpOnOutOfMemoryError package com.zte.oom;
import java.util.ArrayList;import java.util.UUID;
/************************************************** * * title qq184480602 * desc ling * author smart哥 * **************************************************/
public class TestOOM { public static void main(String[] args) { ArrayListString stringArrayList new ArrayList(); for (int i 0; i 1000000 ; i) { String str; for (int j 0; j 1000 ; j) { strstrUUID.randomUUID().toString(); } stringArrayList.add(str); } System.out.println(it is over!!); }
} #设置VM options:
-Xms8m -Xmx8m -XX:HeapDumpOnOutOfMemoryError 大白话
在VMOptions中设置-XX:HeapDumpOnOutOfMemoryError,当出现堆栈溢出的时候dumpJVM堆栈信息到java_pid32216.hprof文件32216为程序在系统中的进程号。
2、运行测试
运行一段时间后会抛出java.lang.OutOfMemoryError: Java heap space 异常。 可以看到发生了内存溢出此时会dump文件到java_pid13320.hprof文件中。
3、导入到MAT工具中进行分析
查看Leak Suspects视图 可以看到有89.07%的内存由Object[]数组占有所以比较可疑。 分析这个可疑是正确的因为已经有超过89%的内存都被它占有这是非常有可能出现内存溢出的,一般达到60%-70%就可以确实是这引起的内存溢出了。 查看Object Details视图详情如下
查看Object Details视图 可以看到集合中存储了大量的uuid字符串。
继续查看dominator视图进一步验证。
查看dominator视图 jstack使用详解及定位死锁问题 jstack的使用 回顾线程的状态 实战死锁问题 jvisualvm使用详解及定位死锁问题 jvisualvm使用详解 启动 查看本地进程 查看CPU、内存、类、线程运行信息 查看线程详情 抽样器 监控远程的jvm