• JVM性能调优


    概念

    JAVA虚拟机中的数据类型为两类:

    1. 基本类型

    包括byte,short,int,long,char,float,double,Boolean,returnAddress。

    2.引用类型

    包括类类型,接口类型和数组

    堆和栈

    栈是运行时的地方,堆是数据存储的地方

    栈主要是解决程序运行问题,即程序如何执行,或者说如何处理程序;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

    1. 栈

    1. 一个线程都对应一个栈(栈帧)。因为线程执行的逻辑有所不同,因此需要一个独立的栈帧。
    2. 存放方法的局部变量,包括基本类型的值和类的实例引用(类的实例,也就是数据存放在堆中)
    3. 存放运行时的数据,包括局部变量表,操作数和帧数据。
    4. 在编译时即可决定栈帧的大小,因此栈帧的深度在编译时确定,不会动态扩展。

    2. 堆

    1. 所有线程共享
    2. 存放类的实例对象,也就是实例数据
    3. 允许动态扩展

    FAQ:

    1. 当一个类中的成员变量定义为static时,他时属于这个类的而不是属于对象的,也就是说在不同的对象中该变量的值是共享的

    2. 当在一个线程的方法中new一个对象后,该对象其实是该线程独有的(除static声明的)。

    值与引用

    不要试图与C进行类比,Java中没有指针的概念

    程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题,不会直接传对象本身

    值得说明的是JAVA在方法中进行参数传递时,针对数据类型的不同是区分对待的。

    1. 当参数传递为基本类型时,传递的是相应变量的值

    2. 当参数传递为对象时,由于在栈帧中对象变量表示的其实是对象的引用,对象的真实数据还存放在对中,因此这时转递的应该是对象的引用而不是对象的值,也就是说当在方法内部修改该变量时,方法运行结束后该对象的数据会发生相应的变化。

    JVM参数

    1. -XX:+UseG1GC -verbose:gc -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/user/crb-order-api-gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10m
    2. JAVA_OPTS='-Xms3096m -Xmx3096m -Dsun.net.inetaddr.ttl=180' 这个只是用于设置堆内存的大小,而JVM运行过程中到底会向操作系统申请多少内存,这个是由JVM在运行过程中动态决定的,我们无法设置

    工具使用

    jvisualvm使用

    1. 该工具直接在jdk中已存在,在win下直接双击即可打开,页面如下

      

    右键点击远程->添加远程主机打开如下页面

     

     

    2. 配置远端JVM,配置如下:

    a. 在JAVA的启动参数中增加如下参数

    1. -Djava.rmi.server.hostname=192.168.0.237 \
    2. -Dcom.sun.management.jmxremote.port=18999 \
    3. -Dcom.sun.management.jmxremote.ssl=false \
    4. -Dcom.sun.management.jmxremote.authenticate=false"
    5. #java.rmi.server:远程服务器地址,使用hostname查看如果不是远程的IP,需要使用sudo hostname 192.168.0.237 设置
    6. #com.sun.management.jmxremote:远程链接的端口号。该端口号不能被占用
    7. #com.sun.management.jmxremote: 链接不适用ssl
    8. #com.sun.management.jmxremote.authenticate 链接不鉴权

    b. jstatd配置

    1. #配置policy文件
    2. cd $JAVA_HOME/bin
    3. cat <<EOF > jstatd.policy
    4. grant codebase "file:\${java.home}/../lib/tools.jar" {
    5. permission java.security.AllPermission;
    6. };
    7. EOF
    8. #在JDK的bin目录下执行如下命令,其中p后为端口号,jstatd.policy为policy文件
    9. ./jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.hostname=192.168.1.103 -J-Djava.rmi.server.logCalls=false -p 20101

    经验配置

    1. #undertow配置
    2. server.undertow.io-threads = 16
    3. server.undertow.worker-threads = 256
    4. server.undertow.buffer-size = 1024
    5. server.undertow.buffers-per-region = 1024
    6. server.undertow.direct-buffers = true
    7. #datasource配置
    8. spring.datasource.druid.url = jdbc:mysql:loadbalance://10.0.245.107:3306,10.0.245.110:3306,10.0.245.111:3306/pcc_membership?user=pcc&password=!QAZ2wsx&useUnicode=true&characterEncoding=utf-8&useSSL=false&useOldAliasMetadataBehavior=true&autoReconnect=true&serverTimezone=GMT%2B8
    9. spring.datasource.druid.initial-size = 5
    10. spring.datasource.druid.min-idle = 5
    11. spring.datasource.druid.max-active = 2000
    12. spring.datasource.druid.max-wait = 60000
    13. spring.datasource.druid.time-between-eviction-runs-millis = 60000
    14. spring.datasource.druid.min-evictable-idle-time-millis =300000
    15. spring.datasource.druid.validationQuery= SELECT 1 FROM pcc_version
    16. spring.datasource.druid.test-while-idle = true
    17. spring.datasource.druid.test-on-borrow = false
    18. spring.datasource.druid.test-on-return= false
    19. spring.datasource.druid.pool-prepared-statements=true
    20. spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20

  • 相关阅读:
    Spring Cloud之BootstrapApplicationListener巧妙构建双容器
    D. Non-zero Segments(前缀和)
    XiaodiSec day028 Learn Note 小迪安全学习笔记
    新冠疫情数据采集
    用Python实现报表自动化详解
    宇宙始终处于完美状态
    JC/T 1062-2022 泡沫混凝土砌块检测
    linux实现SSH免密登录设置,以及shell脚本实现
    【文件后缀名批量修改,python,webp】
    【.net core】【sqlsugar】条件查询时使用Contains的注意问题
  • 原文地址:https://blog.csdn.net/corbin_zhang/article/details/126744856