# JAVA tips
# 查看Java线程栈大小
jinfo -flag ThreadStackSize pid
# 使用NAT工具跟踪内存使用
java -XX:NativeMemoryTracking=summary -jar xxx.jar
jcmd pid VM.native_memory
# 输出类的加载
-verbose:class
现场保存
ss -antp > $DUMP_DIR/ss.dump 2>&1
netstat -s > $DUMP_DIR/netstat-s.dump 2>&1
top -Hp $PID -b -n 1 -c > $DUMP_DIR/top-$PID.dump 2>&1
sar -n DEV 1 2 > $DUMP_DIR/sar-traffic.dump 2>&1
lsof -p $PID > $DUMP_DIR/lsof-$PID.dump
iostat -x > $DUMP_DIR/iostat.dump 2>&1
free -h > $DUMP_DIR/free.dump 2>&1
jstat -gcutil $PID > $DUMP_DIR/jstat-gcutil.dump 2>&1
jstack $PID > $DUMP_DIR/jstack.dump 2>&1
jmap -histo $PID > $DUMP_DIR/jmap-histo.dump 2>&1
jmap -dump:format=b,file=$DUMP_DIR/heap.bin $PID > /dev/null 2>&1
@Configuration
public class DruidConfig {
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource druidDataSource(){
return new DruidDataSource();
}
//后台监控
//因为SpringBoot内置了servlet容器,所以没有web.xml,替代方法:ServletRegisterationBean
@Bean
public ServletRegistrationBean statViewServlet(){
//创建servlet注册实体
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
//设置ip白名单
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
servletRegistrationBean.addInitParameter("deny","192.168.0.19");
//设置控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername","druid");
servletRegistrationBean.addInitParameter("loginPassword","123456");
//是否可以重置数据
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter(){
//创建过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//设置过滤器过滤路径
filterRegistrationBean.addUrlPatterns("/*");
//忽略过滤的形式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
# JOL
分析JVM中对象布局的小工具
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
虚拟机信息
log.info("{}", VM.current().details());
类信息
log.info("{}",ClassLayout.parseClass(String.class).toPrintable());
数组
log.info("{}",ClassLayout.parseClass(byte[].class).toPrintable());
# 重载
三个阶段:
- 在不考虑对基本类型自动装拆箱(auto-boxing,auto-unboxing),以及可变长参数的情况下选取重载方法;
- 如果在阶段1中没有找到适配的方法,那么在允许自动装拆箱,但不允许可变长参数的情况下选取重载方法;
- 如果在阶段2中没有找到适配的方法,那么在允许自动装拆箱以及可变长参数的情况下选取重载方法。
相同阶段
- 形式参数类型的继承关系
如基本类型char在重载方法的参数类型包含基本数据类型,包装类型,接口,父类的查找顺序
- 首先匹配对应的基本数据类型;
- 如果找不到对应的基本数据类型,则可以发生向上转型,匹配转好的基本数据类型,基本数据类型转型顺序为:byte>short>char>int>long>float>double;
- 如果基本数据类型也匹配不到,那么则自动装箱为包装类型,则匹配对应的包装类型;
- 如果找不到包装类型,则匹配包装类型实现的接口或直接父类,它们的优先级一样;
- 如果还是找不到,则匹配更上层的父类,直至到 Object;
- 如果上述都失败了,则匹配变长参数。