jvm优化

不同的事件可能导致JVM暂停所有应用程序线程。 这种暂停称为世界停止(STW)暂停。 触发STW暂停的最常见原因是垃圾回收( 例如github中的示例),但是不同的JIT操作( 示例),偏向锁吊销( 示例),某些JVMTI操作以及更多其他操作也需要停止应用程序。

可以安全停止应用程序线程的点称为“意外点”。 该术语也经常用于指代所有STW暂停。

启用GC日志或多或少是常见的。 但是,这不会捕获所有安全点上的信息。 要获得全部信息,请使用以下JVM选项:

-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

如果您想知道明确引用GC的命名,请不要惊慌-启用这些选项会记录所有安全点,而不仅仅是垃圾收集暂停。 如果您运行下面的示例( github中的源代码),并带有上面指定的标志

public class FullGc {private static final Collection<Object> leak = new ArrayList<>();private static volatile Object sink;public static void main(String[] args) {while (true) {try {leak.add(new byte[1024 * 1024]);sink = new byte[1024 * 1024];} catch (OutOfMemoryError e) {leak.clear();}}}
}

您应该在标准输出中看到类似于以下内容的条目:

Application time: 0.3440086 seconds
Total time for which application threads were stopped: 0.0620105 seconds
Application time: 0.2100691 seconds
Total time for which application threads were stopped: 0.0890223 seconds

读起来很容易(尤其是与GC日志进行比较)–从上面您可以看到应用程序在前344毫秒内成功完成了有用的工作,将所有线程暂停了62毫秒,接着是210毫秒的有用工作和另外89毫秒的暂停。

您可以将这些标志与GC标志结合使用,例如,当再次运行同一程序并添加-XX:+ PrintGCDetails时,输出将类似于以下内容:

[Full GC (Ergonomics) [PSYoungGen: 1375253K->0K(1387008K)] [ParOldGen: 2796146K->2049K(1784832K)] 4171400K->2049K(3171840K), [Metaspace: 3134K->3134K(1056768K)], 0.0571841 secs] [Times: user=0.02 sys=0.04, real=0.06 secs]
Total time for which application threads were stopped: 0.0572646 seconds, Stopping threads took: 0.0000088 seconds

基于以上内容,我们看到应用程序线程被迫停止57毫秒以进行垃圾回收。 等待所有应用程序线程到达安全点所花的时间为8微秒。 但是,如果我们再举一个示例( github中的源代码)并使用相同的选项运行它,我们可能会看到以下输出:

Total time for which application threads were stopped: 0.0001273 seconds, Stopping threads took: 0.0000196 seconds
Total time for which application threads were stopped: 0.0000648 seconds, Stopping threads took: 0.0000174 seconds

由此,我们实际上无法推断出导致暂停的原因,因为没有垃圾收集活动。 如果您希望更详细地了解其他安全点,则可以使用以下两个JVM参数:

-XX:+PrintSafepointStatistics  -XX:PrintSafepointStatisticsCount=1

启用它们会使JVM将其他信息记录到标准输出中,类似于以下内容:

5.141: RevokeBias                       [      13          0              2    ]      [     0     0     0     0     0    ]  0
Total time for which application threads were stopped: 0.0000782 seconds, Stopping threads took: 0.0000269 seconds

根据以下顺序显示有关安全点的信息:

  • 自JVM启动以来的时间戳(以毫秒为单位)(上例中为5.141)
  • 触发暂停的操作的名称( RevokeBias )。
    • 如果看到“无虚拟机操作”,则表示这是所谓的“保证安全点”。
  • 在安全点停止的线程数(13)
  • 在安全点开始时运行的线程数(0)
  • vm操作开始执行时被阻塞的线程数(2)
  • 到达安全点和执行操作的各个阶段的时间(全零)

因此,现在我们看到,使用偏向锁可能会导致发生许多STW暂停,即使它们仅花费数十微秒的时间。 在大量平行的日子里立即禁用它们并不罕见。

总而言之,通过随时记录这些数据,您确实可以为自己省去一些麻烦。 为此,请指定以下JVM选项:

-XX:+LogVMOutput -XX:LogFile=vm.log

并且所有JVM的输出都将存储到vm.log文件中。 但是,根据这些日志进行解释和执行是一个非常广泛的话题,不在本文的讨论范围之内,但是我将来可能会写一两篇有关它的文章,因此,如有兴趣,请随时关注–通过我们的Twitter订阅或通过RSS feed 。

如果您想立即内容,请阅读Nitsan Wakart的精彩博客文章:当然还有OpenJDK源代码。

翻译自: https://www.javacodegeeks.com/2015/04/logging-stop-the-world-pauses-in-jvm.html

jvm优化

jvm优化_在JVM中记录世界停顿相关推荐

  1. jvm gc停顿_在JVM中记录世界停顿

    jvm gc停顿 不同的事件可能导致JVM暂停所有应用程序线程. 这种暂停称为世界停止(STW)暂停. 触发STW暂停的最常见原因是垃圾回收( 例如github中的示例 ),但是不同的JIT操作( 示 ...

  2. 在JVM中记录世界停顿

    不同的事件可能导致JVM暂停所有应用程序线程. 这种暂停称为世界停止(STW)暂停. 触发STW暂停的最常见原因是垃圾回收( 例如github中的示例 ),但是不同的JIT操作( 示例 ),偏向锁吊销 ...

  3. jvm优化_您的JVM是否泄漏了文件描述符-像我的一样?

    jvm优化 前言:此处描述的两个问题是在一年前发现并修复的. 本文仅作为历史证明,也是有关解决Java中文件描述符泄漏的初学者指南. 在Ultra ESB中,我们使用内存RAM磁盘文件缓存来进行快速且 ...

  4. jvm优化_使用Java流和In-JVM-Memory的超低延迟查询

    jvm优化 自然界的基本规则(例如光速和通用信息论)对我们可以从传统系统体系结构中获得的最大性能设置了明显的限制. 了解您作为Java开发人员如何使用JVM技术和Java流将性能提高几个数量级. 例如 ...

  5. jvm优化_镜像镜像–使用反射在运行时查看JVM内部

    jvm优化 开发人员:Takipi会告诉您何时新代码在生产中中断–了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射. 它是Java和Scala编程的主要方面,它使我们使用的库 ...

  6. 如何实现java虚拟机的优化_Java虚拟机JVM优化实战的过程全记录

    前言 Java虚拟机是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一.Java虚拟机是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的,通过Jav ...

  7. java8的jvm优化_基于JDK8 版本的SpringBoot 启动参数优化(建议收藏)

    Linux端运行项目命令 java -jar -XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=128m-Xms1024m -Xmx1024m-Xmn256m-Xs ...

  8. java递归优化_在Java中谈尾递归--尾递归和垃圾回收的比较

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  9. jvm开源_开源JVM Sampling Profiler

    jvm开源 众所周知 ,大多数现有的采样Java Profiler都必须在安全的地方进行堆栈跟踪收集. 诸如采样探查器之类的探查器就是这种情况,它使用SUN / Oracle管理代理来收集其堆栈跟踪. ...

最新文章

  1. 【semantic】本体和语义网的研究方向
  2. 【博客搬家旧文】leetcode 771. Jewels and Stones
  3. [转载] 让SciTE能够和IDE一样进行成员提示
  4. 编译安装php的openssl组件时遇到 libssl not found解决办法
  5. electron 打包后 __static_electron开发客户端注意事项(兼开源个人知识管理工具“想学吗”)...
  6. 剩余 大小 查看内存_JVM的内存分配策略以及进入分代的条件
  7. python 编写简单网页服务器
  8. CAN笔记(13) STM32-M4 bxCAN
  9. 使用Swagger UI的Document和Test API
  10. power bulider 9.0 如何将sql语句查询的值返回给变量_SQL—你应该知道的子查询
  11. C语言 进制转换 将十进制转换为任意进制
  12. 《完全写作指南》晨读笔记
  13. iphone引用自定义字体 html,在网页上使用苹果字体
  14. 谷歌搜索没有相机图标_关于Google图片网站不能以图搜图的解决方案
  15. Java: 实训三 类与对象、继承
  16. LED办公楼宇照明节能方案及城市夜景照明节能方案
  17. 7种超轻量级的Linux发行版,希望能够帮助你找到适合自己的操作系统
  18. 用python画 pareto front
  19. 【面向对象程序设计】侩子手游戏(Java、JavaFX)
  20. 历史上消失的十天--儒略日(Julian Days)的来历

热门文章

  1. python画简单花的代码_Python竟能画这么漂亮的花,帅呆了(代码分享)
  2. 17.Rust中函数式语言功能:迭代器与闭包
  3. Excel日期按秒自增公式
  4. 小程序流量主广告赚钱
  5. 有了AI,程序猿再也不用担心有Bug了
  6. 自动化操作桌面之根据图片移动鼠标
  7. 用python进行简单的excel表格分析
  8. qt5 开发及实例(第4版)_才聪学习网_中级微观经济学第4版练习题详解
  9. Python爬虫实战使用scrapy与selenium来爬取数据
  10. 无线传感器网络的时钟同步估计问题(Matlab代码实现)