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参数

-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


JAVA_OPTS='-Xms3096m -Xmx3096m -Dsun.net.inetaddr.ttl=180' 这个只是用于设置堆内存的大小,而JVM运行过程中到底会向操作系统申请多少内存,这个是由JVM在运行过程中动态决定的,我们无法设置

工具使用

jvisualvm使用

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

  

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

 

 

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

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

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

b. jstatd配置

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

经验配置

#undertow配置
server.undertow.io-threads = 16
server.undertow.worker-threads = 256
server.undertow.buffer-size = 1024
server.undertow.buffers-per-region = 1024
server.undertow.direct-buffers = true

#datasource配置
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
spring.datasource.druid.initial-size = 5
spring.datasource.druid.min-idle = 5
spring.datasource.druid.max-active = 2000
spring.datasource.druid.max-wait = 60000
spring.datasource.druid.time-between-eviction-runs-millis = 60000
spring.datasource.druid.min-evictable-idle-time-millis =300000
spring.datasource.druid.validationQuery= SELECT 1 FROM pcc_version
spring.datasource.druid.test-while-idle = true
spring.datasource.druid.test-on-borrow = false
spring.datasource.druid.test-on-return= false
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大叔比较胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值