参考廖雪峰老师的这篇

JVM调优的正确姿势: https://www.liaoxuefeng.com/article/1336345083510818

查看某个JVM进程堆内存信息

  1. # 查询端口号
  2. C:\Users\admin>netstat -ano|findstr 8081
  3. TCP 0.0.0.0:8081 0.0.0.0:0 LISTENING 8792
  4. TCP [::]:8081 [::]:0 LISTENING 8792
  5. # jmap -heap <pid>
  6. C:\Users\admin>jmap -heap 8792
  7. Attaching to process ID 8792, please wait...
  8. Debugger attached successfully.
  9. Server compiler detected.
  10. JVM version is 25.251-b08
  11. using thread-local object allocation.
  12. Parallel GC with 4 thread(s)
  13. Heap Configuration:
  14. MinHeapFreeRatio = 0
  15. MaxHeapFreeRatio = 100
  16. MaxHeapSize = 2147483648 (2048.0MB)
  17. NewSize = 715653120 (682.5MB)
  18. MaxNewSize = 715653120 (682.5MB)
  19. OldSize = 1431830528 (1365.5MB)
  20. NewRatio = 2
  21. SurvivorRatio = 8
  22. MetaspaceSize = 536870912 (512.0MB)
  23. CompressedClassSpaceSize = 528482304 (504.0MB)
  24. MaxMetaspaceSize = 536870912 (512.0MB)
  25. G1HeapRegionSize = 0 (0.0MB)
  26. Heap Usage:
  27. PS Young Generation
  28. Eden Space:
  29. capacity = 537395200 (512.5MB)
  30. used = 390193272 (372.11730194091797MB)
  31. free = 147201928 (140.38269805908203MB)
  32. 72.60825403725228% used
  33. From Space:
  34. capacity = 89128960 (85.0MB)
  35. used = 27779432 (26.492530822753906MB)
  36. free = 61349528 (58.507469177246094MB)
  37. 31.167683320886947% used
  38. To Space:
  39. capacity = 89128960 (85.0MB)
  40. used = 0 (0.0MB)
  41. free = 89128960 (85.0MB)
  42. 0.0% used
  43. PS Old Generation
  44. capacity = 1431830528 (1365.5MB)
  45. used = 122896 (0.1172027587890625MB)
  46. free = 1431707632 (1365.382797241211MB)
  47. 0.008583138688323874% used
  48. 23174 interned Strings occupying 2401368 bytes.

微调JVM启动参数

JVM参数大致可以分为三类

  • 标准指令:- 开头,这些是所有的 HotSpot 都支持的参数。可以用 java -help 打印出来。

  • 非标准指令:-X 开头,这些指令通常是跟特定的 HotSpot 版本对应的。可以用 java -X 打印出来。

  • 不稳定参数:-XX 开头,这一类参数是跟特定 HotSpot 版本对应的,并且变化非常大。详细的文档资料非常少。

JDK1.8之前元空间叫永久代

STW(Stop-The-World):是指JVM在执行垃圾收集算法时,所有的用户线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些停顿现象多半是由于GC引起。

堆内存默认分配:新生区占1/3,老年区占2/3

新生区分为3块 Eden、From(S0)、To(S1),默认占比是 8:1:1

  1. # -Xms: 设置堆初始化内存大小, 默认是 1/64
  2. # -Xmx: 设置最大分配内存大小, 默认是 1/4
  3. # -Xss: 线程栈大小
  4. # -XX:MetaspaceSize: 元空间大小
  5. # -XX:MaxMetaspaceSize: 元空间最大大小
  6. java -Xms2G -Xmx2G -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar app.jar
  7. # -XX:MaxGCPauseMillis: GC进行STW的最大停顿时间, JVM将尽可能(但不保证)停顿小于这个时间
  8. # -XX:+UseG1GC 使用G1垃圾收集器
  9. java -Xms2G -Xmx2G -Xss1M -XX:+UseG1GC -XX:MaxGCPauseMillis=100ms -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar app.jar

查看JVM的一些默认参数

  1. C:\Users\admin>java -XX:+PrintCommandLineFlags -version
  2. -XX:InitialHeapSize=132884864 -XX:MaxHeapSize=2126157824 -XX:+PrintCommandLineFlags
  3. -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
  4. -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
  5. java version "1.8.0_251"
  6. Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
  7. Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)

从上面可以看出JDK8默认使用的GC是 ParallelGC = Parallel Scavenge + Parallel Old

JDK各个版本的GC,来源:https://www.cnblogs.com/zeze/p/6610163.html

新生代

  • 1.3:Seriall
  • 1.4:ParNew、Parallel Scavenge

老年代

  • 1.5:CMS、Serial Old(MSC)
  • 1.6:Parallel Old
  • 1.7:G1(收集器在JDK 1.7 u4版本正式投入使用)

查看GC的详细信息

  1. C:\Users\admin>java -XX:+PrintGCDetails -version
  2. java version "1.8.0_251"
  3. Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
  5. Heap
  6. PSYoungGen total 38400K, used 2005K [0x00000000d5c00000, 0x00000000d8680000, 0x0000000100000000)
  7. eden space 33280K, 6% used [0x00000000d5c00000,0x00000000d5df54b8,0x00000000d7c80000)
  8. from space 5120K, 0% used [0x00000000d8180000,0x00000000d8180000,0x00000000d8680000)
  9. to space 5120K, 0% used [0x00000000d7c80000,0x00000000d7c80000,0x00000000d8180000)
  10. ParOldGen total 87552K, used 0K [0x0000000081400000, 0x0000000086980000, 0x00000000d5c00000)
  11. object space 87552K, 0% used [0x0000000081400000,0x0000000081400000,0x0000000086980000)
  12. Metaspace used 2360K, capacity 4480K, committed 4480K, reserved 1056768K
  13. class space used 255K, capacity 384K, committed 384K, reserved 1048576K

查看JVM默认参数及微调JVM启动参数的更多相关文章

  1. linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/17093297 最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动. 看的过 ...

  2. JVM启动参数手册——JVM之八

    jdk1.4.2 JVM官方地址:http://java.sun.com/j2se/1.4.2/docs/guide/vm/index.html 标准和非标注参数(for windows):http: ...

  3. JVM启动参数大全

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  4. JVM源码分析之JVM启动流程

      原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十四篇. 今天呢!灯塔君跟大家讲: JVM源码分析之JVM启动流程 前言: 执行Java类的main方法,程序就能运 ...

  5. JAVA启动参数整理[转]

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  6. JAVA启动参数整理

    http://blog.csdn.net/turkeyzhou/article/details/7619472 java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的 ...

  7. java启动参数一

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  8. linux启动参数了解

    文章来源:http://blog.csdn.net/uyiwfn/article/details/7172339在Linux中,给kernel传递参数以控制其行为总共有三种方法:1.build ker ...

  9. LINUX KERNEL启动参数

    LINUX KERNEL启动参数 在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时 ...

随机推荐

  1. Filebrowser 安装简介

    官网地址: https://filebrowser.org https://github.com/filebrowser/filebrowser 官网安装方法: curl -fsSL https:// ...

  2. mybatis自定义打印执行时间并格式化sql插件

    打印SQL的执行时间,我们可以实现mybatis官方我们提供的接口org.apache.ibatis.plugin.Interceptor,我们可以拦截的类有多个Executor,StatementH ...

  3. 开箱即用的微服务框架 Go-zero(进阶篇)

    之前我们简单介绍过 Go-zero 详见<Go-zero:开箱即用的微服务框架>.这次我们从动手实现一个 Blog 项目的用户模块出发,详细讲述 Go-zero 的使用. 特别说明本文涉及 ...

  4. [HTML]常用的文本标签(标题、段落、加粗、下划线等标签)

    标签类型 写法 说明 标题 <h1></h1>......<h6></h6> 加粗.独占一行(块级元素) 段落 <p></p> ...

  5. Flannel和Calico网络插件对比

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  6. MiniSMB 专业网络性能测试仪表 英特尔82576 4*1GE 网卡性能测试报告

    MiniSMB 专业网络性能测试仪表英特尔82576 4*1GE网卡性能测试报告 一.测试环境 测试配置 ①工控机配置: CPU:Intel(R) Core(TM) i7-6800K CPU @ 3. ...

  7. 17、lnmp_php编译安装

    17.1.FastCGI介绍: 1.什么是CGI: CGI的全称为"通用网关接口",为http服务器与其他机器上的程序服务通信交流的一种工具,CGI程序 必须运行在网络服务器上:传 ...

  8. 2300+字!在不同系统上安装Docker!看这一篇文章就够了

    辰哥准备出一期在Docker跑Python项目的技术文,比如在Docker跑Django或者Flask的网站.跑爬虫程序等等. 在Docker跑Python程序的时候不会太过于细去讲解Docker的基 ...

  9. 第三章 - CPU缓存结构和java内存模型

    CPU 缓存结构原理 CPU 缓存结构 查看 cpu 缓存 速度比较 查看 cpu 缓存行 cpu 拿到的内存地址格式是这样的 CPU 缓存读 根据低位,计算在缓存中的索引 判断是否有效 0 去内存读 ...

  10. Bootstrap-table 显示行号

    趁热打铁,使用bootstrap-table时,想要显示每行的行号,再网上查了查,网上给的显示行号的大部分方法,只要一翻页,行号就会又从1开始计算, 也许没有碰到想要的,自己试着解决了这个问题,本人初 ...