我是靠谱客的博主 等待小猫咪,最近开发中收集的这篇文章主要介绍JVM性能调优概念堆和栈值与引用JVM参数工具使用jvisualvm使用经验配置,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

概念

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

最后

以上就是等待小猫咪为你收集整理的JVM性能调优概念堆和栈值与引用JVM参数工具使用jvisualvm使用经验配置的全部内容,希望文章能够帮你解决JVM性能调优概念堆和栈值与引用JVM参数工具使用jvisualvm使用经验配置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部