跳至主要内容

博文

目前显示的是 二月, 2020的博文

Java微型网络程序GC调优练习

Java微型网络程序GC调优练习 简介 最近用java写了一个微型的网络程序,没进行GC调优的情况下就已经满足性能要求。不过想通过对这个程序调优,再熟悉一下GC调优流程。 通过活跃数据大小设置堆内存大小 活跃数据大小指的是应用程序员运行于稳定态时,长期存活的对象在Java堆中占用的空间大小。所以可以在程序稳定运行时,进行多次Full GC,之后再查看Java堆的占用情况来测量活跃数据大小。 调优过程需要一步一步多次确定更合适的值,JVM的初始参数和版本信息如下(堆大小按感觉先随意分配256M,如果有溢出再调整): -Xms256m -Xmx256m -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MaxDirectMemorySize=512m -XX:+PrintCommandLineFlags -XX:+UseParallelGC java version "1.8.0_241" Java(TM) SE Runtime Environment (build 1.8.0_241-b07) Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode) 其中 -XX:+PrintGCDetails 参数表示打印垃圾回收情况, -XX:+PrintGCTimeStamps 参数表示每次打印的时候带上JVM启动到当前时间的秒数,也可以使用 -XX:+PrintGCDateStamps 打印日历时间。 -XX:+UseParallelGC 是java8在Windows64上的默认选择,表示同时启用多线程新生代和多线程老年代的Parallel垃圾收集器[1],这一点可能跟旧版本的java不一样(对旧版本java的没太多研究)。 用这个程序来看平均速率在200KB/S左右的直播。运行一段时间之后,程序达到稳定状态。由于这个程序在256M内存下,不经常发生Full GC,所以在程序稳定运行的时候,用 visualvm 触发多次Full GC。每次Full GC的结果比较相似,选取其中一个显示如下(已调整换行): 1887.144: [Full GC (System.gc())

visualvm的profiler连接问题

visualvm的profiler连接问题 在 Windows 10 上,用JDK8 自带的 jvisualvm.exe 连接java程序,出现了几个问题。 问题1:选择profiler分析的时候,一直卡在“正在连接目标VM”: 解决:在命令行中用以下命令启动: jvisualvm.exe -J-Dorg.netbeans.profiler.separateConsole=true 用这个方法启动过一次,第二次就可以直接双击启动,不用再从命令行启动了。 问题2:使用上面方法启动之后,再次选择profiler分析,出现 Redefinition failed with error 62 解决:在被分析的程序启动时,加上JVM参数: -Xverify:none 。 JDK内置的 visualvm 版本比较老,以上问题在我从官网上下载新的1.4.4版本的 visualvm 后都正常了。在JDK9之后,JDK也不再内置 visualvm ,所以还是单独下一个备着会比较好。 参考: https://stackoverflow.com/questions/37632783/visualvm-cpu-memory-profiler-stuck-at-connecting-to-the-target-jvm https://github.com/oracle/visualvm/issues/33 https://visualvm.github.io https://blogs.oracle.com/java-platform-group/visual-vm-in-jdk-9-and-beyond