package com.study.performance;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication; import java.util.Random;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit; // 启动程序,模拟用户请求

// 每100毫秒钟创建1000线程,每个线程创建一个512kb的对象,最多100毫秒内同时存在1000线程,并发量1000/s,吞吐量6000/s,查看GC的情况

@SpringBootApplication

public class PerformanceApplication {

public static void main(String[] args) {

SpringApplication.run(PerformanceApplication.class, args);

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {

new Thread(() -> {

for (int i = 0; i < 1000; i++) {

try {

// 不干活,专门512kb的小对象

byte[] temp = new byte[1024 * 512];

Thread.sleep(new Random().nextInt(100)); // 随机睡眠200毫秒秒以内

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

}, 100, 100, TimeUnit.MILLISECONDS);

}

}
// 打包 mvn clean package

// 服务器上运行 performance-1.0.0.jar

//对象存活1秒的场景,远远超过平时接口的响应时间要求,场景应该是吞吐量优先

ivan@ivan-virtual-machine:~/Desktop$ jmap
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server) where <option> is one of:

<none> to print same info as Solaris pmap

-heap to print java heap summary

-histo[:live] to print histogram of java object heap; if the "live"

suboption is specified, only count live objects

-clstats to print class loader statistics

-finalizerinfo to print information on objects awaiting finalization

-dump:<dump-options> to dump java heap in hprof binary format

dump-options:

live dump only live objects; if not specified,

all objects in the heap are dumped.

format=b binary format

file=<file> dump heap to <file>

Example: jmap -dump:live,format=b,file=heap.bin <pid>

-F force. Use with -dump:<dump-options> <pid> or -histo

to force a heap dump or histogram when <pid> does not

respond. The "live" suboption is not supported

in this mode.

-h | -help to print this help message

-J<flag> to pass <flag> directly to the runtime system ivan@ivan-virtual-machine:~/Desktop$ jcmd

9476 sun.tools.jcmd.JCmd

8622 performance-1.1.0.jar root@ivan-virtual-machine:/home/ivan/Desktop# jmap -heap 8622

Attaching to process ID 8622, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.242-b08 using thread-local object allocation.

Mark Sweep Compact GC Heap Configuration:

MinHeapFreeRatio = 40

MaxHeapFreeRatio = 70

MaxHeapSize = 1073741824 (1024.0MB)

NewSize = 11141120 (10.625MB)

MaxNewSize = 357892096 (341.3125MB)

OldSize = 22413312 (21.375MB)

NewRatio = 2

SurvivorRatio = 8

MetaspaceSize = 21807104 (20.796875MB)

CompressedClassSpaceSize = 1073741824 (1024.0MB)

MaxMetaspaceSize = 17592186044415 MB

G1HeapRegionSize = 0 (0.0MB)
Heap Usage:

Exception in thread "main" java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.tools.jmap.JMap.runTool(JMap.java:201)

at sun.tools.jmap.JMap.main(JMap.java:130)

Caused by: java.lang.RuntimeException: unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap

at sun.jvm.hotspot.tools.HeapSummary.run(HeapSummary.java:144)

at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)

at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)

at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)

at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:49)

... 6 more

java版本问题报错

最大停顿时间是尽力保持,调整新生代和老年代的大小

GCTimeRatio也没啥用

SurvivorRatio也没啥用,自动会调整

案例

测试环境:JVM配置为2核1G,JAVA8,固定设置堆大小 1G

awk这个就是转换为字符串并且用空格进行分割,然后取得第一位

jinfo查看一下不是默认的参数

1、 调大-XX:ParallelGCThreads=4

java -Xmx1024m -Xloggc:/netease/gc2.log -XX:ParallelGCThreads=4  -jar performance-1.0.0.jar
jstat -gc -h10 $(jcmd | grep "performance-1.0.0.jar" | awk '{print $1}') 1000

线程还是要和核数相同最优

2、 降低耗时

设置-XX:MaxGCPauseMills=10

java -Xmx1024m -Xloggc:/netease/gc3.log -XX:MaxGCPauseMillis=10  -jar performance-1.0.0.jar

3、 改用CMS回收器

java -Xmx1024m -Xloggc:/netease/gc4.log -XX:+UseConcMarkSweepGC  -jar performance-1.0.0.jar

这个垃圾回收器不适用于吞吐量优先的情况。

https://docs.oracle.com/javase/8/

4、 增加线程

java -Xmx1024m -Xloggc:/netease/gc4.log -XX:+UseConcMarkSweepGC  -XX:ConcGCThreads=3 -jar performance-1.0.0.jar

用户线程和GC线程,会和用户线程争抢cpu

5、改用G1

java -Xmx1024m -Xloggc:/netease/gc10.log  -XX:+UseG1GC -jar performance-1.0.0.jar
 

6、增加分区大小

java -Xmx1024m -Xloggc:/netease/gc11.log  -XX:+UseG1GC -XX:G1HeapRegionSize=64m -jar performance-1.0.0.jar

示例代码 -2

2.1  GC调优

3、 结语

主要是演示切换的过程和思路,实际还是要结合系统情况、系统需要来调整。

1、 GC调优就是逐步调试的过程,对每个参数的含义了解后,再根据官方手册,一个个调试,找到符合应用的最佳配置点。

2、 再重复一句,性能问题,98.75%上是业务代码上面。

3、 无监控,不调优。

Java后端进阶-JVM参数调优的更多相关文章

  1. JVM参数调优

    JVM参数调优 JVM参数调优是一个很头痛的问题,可能和应用有关系,下面是本人一些调优的实践经验,希望对读者能有帮助,环境LinuxAS4,resin2.1.17,JDK6.0,2CPU,4G内存,d ...

  2. (转)JVM参数调优八大技巧

    这里和大家分享一下JVM参数调优的八条经验,JVM参数调优,这是很头痛的问题,设置的不好,JVM不断执行FullGC,导致整个系统变得很慢,网站停滞时间能达10秒以上,相信通过本文的学习你对JVM参数 ...

  3. SpringBoot-内部运行jvm参数调优

    SpringBoot JVM参数调优 这个根据服务器的内存大小,来设置堆参数. -Xms :设置Java堆栈的初始化大小 -Xmx :设置最大的java堆大小 实例参数-XX:+PrintGCDeta ...

  4. 性能测试三十六:内存溢出和JVM常见参数及JVM参数调优

    堆内存溢出: 此种溢出,加内存只能缓解问题,不能根除问题,需优化代码堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java h ...

  5. 【学习】011 JVM参数调优配置

    自动内存管理机制 Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmar ...

  6. JVM参数调优:Eclipse启动实践

    本文主要参考自<深入理解 Java 虚拟机>.这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过程,包括了 JVM(Java ...

  7. JAVA系列之JVM内存调优

    一.前提 JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响.在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解.同时,在 ...

  8. JVM参数调优总结

    一.前言 要想成为一名高级Java开发具备JVM调优的能力必不可少,能够根据项目实际情况进行JVM调优的前提是理解JVM原理和常用JVM参数的含义及作用,虽然<深入理解Java虚拟机>这本 ...

  9. jvm 参数调优

    FROM: http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html#CMSInitiatingOccupancyFraction ...

随机推荐

  1. 死磕Spring之IoC篇 - 深入了解Spring IoC(面试题)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  2. (十一) 数据库查询处理之连接(Join)

    (十一) 数据库查询处理之连接(Join) 1. 连接操作的一个例子 把外层关系和内层关系中满足一定关系的属性值拼接成一个新的元组 一种现在仍然十分有用的优化思路Late Materializatio ...

  3. Markdown(2)基本语法

    ​ Markdown 是一种轻量级标记语言 , 通过简单的标记语法,使文本内容具有一定的格式 . 一.段落 1. 标题 语法格式: 符号 "#" 可以标记 1~6级标题.一级标题对 ...

  4. 转: 微信已支持发送最大 200MB 的视频了,并且不会被压缩 来自腾讯微信团队的视频消息,目前 iOS 版本的微信已支持发送最大 200MB 的视频与图片了,并且不会被压缩.安卓版本未来一段时间会支 ...

  5. LeetCode-二叉搜索树的第k大节点

    二叉搜索树的第k大节点 LeetCode-面试题54 需要充分了解二叉搜索树的性质. 利用中序遍历的思想,采用相反的思想:先遍历右节点再遍历左节点. /** * 给定一棵二叉搜索树,请找出其中第k大的 ...

  6. 翻译:《实用的Python编程》03_05_Main_module

    目录 | 上一节 (3.4 模块) | 下一节 (3.6 设计讨论) 3.5 主模块 本节介绍主程序(主模块)的概念 主函数 在许多编程语言中,存在一个主函数或者主方法的概念. // c / c++ ...

  7. python工业互联网应用实战7—业务层

    本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...

  8. WPF 基础 - 点击事件的执行顺序及 Button 点击事件的特殊性

    1. 点击事件的执行顺序 PreviewMouseLeftButtonDown PreviewMouseDown MouseLeftButtonDown MouseDown PreviewMouseL ...

  9. 【翻译】内部API的价值

    内部api的设计,主要是为了简化软件的开发,简化系统和操作过程.目前绝大多数用例是这样的. 内部api经常被忽略,因为它们是针对内部开发人员的.这种类型的api通常使用于特定公司及其部门的专用数据.尽 ...

  10. HTTP 状态码(转载)

    本文由 简悦 SimpRead 转码, 原文地址 www.cnblogs.com HTTP 状态码 (HTTP Status Code) 状态码并不是每个都有,为了后期扩展.[update201705 ...