本文介绍JVM的启动参数,主要目的用于JVM的调优

日记:根据经验,一般minor GC(Young GC)1分钟以上一次是正常的,而Full GC是几小时,甚至几天,才发生一次,当然,虚拟机调优没有绝对的标准,这只是经验参考而已

先介绍一个简单的学习工具,不适合生产,cmd,使用下面命令

jvisualvm

打开一个java VisualVM页面,该页面可用来查看java程序内存情况,不适合生产的原因是涉及各种权限问题,且该程序比较卡

-Xlog:gc(-XX:+PrintGC的替代者)
每次GC的时候,都会打印日志,下面的代码会GC两次

public static void printGC() {for (int i = 0; i < 2; i++) {System.gc();}
}

下面是GC两次的打印结果

[0.035s][info][gc] Using G1
[0.325s][info][gc] GC(0) Pause Full (System.gc()) 1M->0M(8M) 7.705ms
[0.330s][info][gc] GC(1) Pause Full (System.gc()) 0M->0M(8M) 4.494ms

只看GC(0)的那一行即可,改行表示第一次GC之后打印出的日志
0.325s:表示虚拟机启动之后的0.325秒时候发生的(时间偏移)
1M:表示回收之前,堆的使用大小是1M
0M:表示回收之后,堆的使用大小是0M
8M:表示堆的总大小
7.705ms:表示本次GC所用的时间是7.705毫秒

-Xlog:gc星号(-XX:+PrintGCDetails的替代者)

-Xlog:gc*(-XX:+PrintGCDetails的替代者)
堆的使用大小是1M
[0.032s][info][gc,heap] Heap region size: 1M
使用G1垃圾收集器
[0.039s][info][gc     ] Using G1
等等等

-Xlog:class+load=info(-XX:+TraceClassLoading的替代者)
可以用来跟踪类的加载,如果一个要加载的类是aop或者asm动态生成的,那么这个类将不会在文件系统上存在class文件,这个时候可以跟踪类的加载,来定位到这个类是怎么加载到虚拟机的

-XX:+PrintVMOptions
可以查看虚拟机启动的时候,都传递了哪些参数
日记:我个人觉得这不是毫无意义吗,这个PrintVMOptions就是启动参数之一,难道我自己启动的时候我还不知道我传递了什么参数???除非PrintVMOptions能随时使用,要不然就没有意义啊

-Xms初始堆,-Xmx最大堆
下面的参数表示初始堆5M,最大堆20M

-Xms5m
-Xmx20m

-Xmn设置新生代大小
本参数很重要,新生代大小一半设置成总大小的三分之一到四分之一之间,因为总大小不变,那么新生代越大,则老年代就越小,所以恰当的设置该值至关重要

-XX:SurvivorRatio=eden/from=eden/to
用来设置新生代中eden空间和from空间,eden空间和to空间的比例关系,假设新生代大小100M,且

-XX:SurvivorRatio=2

表示from=25,to=25,eden=50

-Xss
设置栈的初始大小,不是整个jvm的栈总大小,而是一个线程下的栈的大小
相对的,该值设置的越大,那么jvm中能开的线程数量就越少,合理设置这个大小可以对虚拟机优化

-XX:PretenureSizeThreshold
定义多大的对象是大对象,由于定义大对象只在Serial和ParNew这两个垃圾收集器下有效,所以需要指定垃圾收集器

// 1000000表示字节
-XX:PretenureSizeThreshold=1000000 -XX:+UseSerialGC

上面这行命令定义了一个对象如果大于1MB,则是大对象,直接进入老年代

jps命令
jsp是JavaVirtual Process Status的缩写,不是启动参数,而是系统命令,使用该命令可查看当前系统下所有的java线程和线程id
可以使用jmap -heap 线程id命令查看堆的情况,例如

jmap -heap 21316

注:如果你遇见了can’t determine target’s VM version错误,则说明你本地的jdk版本与编译器的jre版本不匹配,也就是说使用java -version显示的jdk版本和IDE中使用的jre版本不同

jstat -gc java线程id 多少毫秒统计一次 一共统计多少次

// 统计线程id是5638的java程序,每1000毫秒统计一次,一共统计33次
jstat -gc 5638 1000 33

jmap -histo 线程id
查看整个堆内存所有对象使用情况

jmap -histo 5638
// 下面是打到指定的文件中
jmap -histo 5638 >./aa.txt

可以查看我们自己程序哪些对象不正常,比如对象特别多的情况,我们自己程序的对象都是我们自己包名开头的那些

jstack
使用top -p java进程id,例如

top -p 5638

然后按H,找到内存和cpu占用最高的线程id,比如4977,转为16进制
得到1371,执行

jstack 4799|grep -A 10 1371

得到4799线程信息的前10行,从这个中查找可能存在的问题代码

笔记:还有一个叫GCEasy的工具,可以用来分析GC日志,这个工具是网页版的,目的是用来给熟悉jvm,但是不熟悉业务的人,使用的

Java-虚拟机-启动参数及调优相关推荐

  1. Java虚拟机这一块 —— JVM 调优和深入了解性能优化

    JVM 调优和深入了解性能优化 JVM 调优的本质 GC 调优原则 调优的原则 目的 GC 调优 调优步骤 日志分析 阅读 GC 日志 -XX:+UseSerialGC -XX:+UseParNewG ...

  2. java虚拟机启动参数分类详解

    HotSpot是较新的Java虚拟机技术,用来代替JIT(Just in Time)技术,可以大大提高Java运行的性能.Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢.而该技术将常 ...

  3. 深入理解Java虚拟机:Jvm性能调优

    本篇内容包括:Jvm 性能调优简介:根据需求目标进行 Jvm 调优规划(即 调优的目标.调优的步骤):Jvm 调优参数.命令.工具:以及 Java 中的内存泄露问题的详解- 一.Jvm 性能调优简介 ...

  4. vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...

    本套课程从虚拟机的发展历史,虚拟机的内存结构,对象的分配与回收以及字节码,类加载等多个方面深入地对Java虚拟机进行了剖析.内容详实,语言通俗易懂.理论结合实践,让学习本套视频的朋友可以更快的理解虚拟 ...

  5. Java虚拟机性能监控与调优实战

    Java虚拟机的内存结构,区别于侧重于多线程的Java内存模型(Java Memory Model) 但在此之前,我们该思考一下:JVM的内存结构为什么要这样划分? 我认为主要是依据于不同数据的更新频 ...

  6. java虚拟机启动参数Xms,启动JVM时,-Xms和-Xmx参数是什么?

    Please explain the use of Xms and Xmx parameters in JVMs. What are the default values for them? 解决方案 ...

  7. 深入理解JVM虚拟机10:JVM常用参数以及调优实践

    本文转自[JVM常用参数以及调优实践](https://blog.csdn.net/a724888/article/details/78367780) JVM常用参数选项 jvm 可配置的参数选项可以 ...

  8. Java 9 中的 GC 调优基础

    转载自   Java 9 中的 GC 调优基础 在经过了几次跳票之后,Java 9终于在原计划日期的整整一年之后发布了正式版.Java 9引入了很多新的特性,除了闪瞎眼的Module System和R ...

  9. java虚拟机中参数的使用和具体介绍

    命名 java - 启动一个Java应用程序 简介 要启动一个类文件. java[options] mainclass [args -]. 要启动JAR文件中的主类. java[options] -j ...

最新文章

  1. python中列表常用方法_Python中列表的常用方法
  2. Gradle 使用技巧(四) - 如何定位和解决依赖冲突
  3. js实现旋转木马轮播图
  4. C# .Net中的类型转换
  5. 新浪微博-企业微博运营手册
  6. python没有pil模块_Python离线安装PIL 模块的方法
  7. 祝张远远和杨凯博同学生日快乐 | 班级日常分享
  8. 计算力就是你的核心业务!
  9. minheight能继承吗_CSS min-height最小高度max-height最大高度
  10. 系统工程师Python工程师基础班
  11. gb28181的sip通信
  12. 【渝粤教育】国家开放大学2019年春季 1117机电控制与可编程序控制 参考试题
  13. Lecture 1:强化学习简介
  14. python语法32[装饰器decorator](转)
  15. Python(七):输入输出(IO)、文件读写
  16. python cnn入门_pytorch实现CNN卷积神经网络
  17. 开源Java(JSP) CMS系统源码推荐
  18. 数据库“新增字段、删除字段、修改字段“
  19. 数据库——实体联系模型
  20. CentOS7 建立静态 IP(eth0)

热门文章

  1. Trees on the level UVA - 122 (二叉树的层次遍历)
  2. 遇到一个php的错误,php初学者常见的几个错误及解决方法
  3. java 输出xml文件_java解析xml文件并输出
  4. 高效能人士的七个习惯_有史以来最具影响力管理类书籍 高效能人士的七个习惯 让你成为一名成功高效的人士...
  5. win10照片查看器_图片打开方式中找不到Windows图片查看器怎么办
  6. matlab做信号实验需要安装那些模块_无人机基于Matlab/Simulink的模型开发(连载一)...
  7. kettle执行组件时为什么使用克隆对象
  8. 赵娜计算机,新学期 新起点 新征程——计算机学院2016级召开系列年级工作会议...
  9. mysql8日志文件密码_mysql8 参考手册--mysqlbinlog-处理二进制日志文件的实用程序
  10. layui横向时间线_用打火机或烟头烧羽毛球拍线坏处多