# 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;
  • 如果上述都失败了,则匹配变长参数。