跳至主要內容
给对象设置null的意义

前言:是否需要把不用的对象设置为null?

1、开始写代码测试(所有测试都要加上以下指令)

jvm参数-Xms20m -Xmx20m -Xmn10m -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=2097152

简单解释一下:

  • -Xms20m -Xmx20m这两个指令限制堆内存固定为20m不允许扩容
  • -Xmn10m代表分配给新生代的总内存为10m
  • -XX:SurvivorRatio=8代表Eden区和Survivor的比例8:1,即新生代被分为3部分,分别8m,1m,1m
  • XX:PretenureSizeThreshold=2097152,这个指令用的比较少,在虚拟机中,普通对象都在新生代分配内存,但是大对象是直接在老年代分配,至于多大算大对象,就是这个参数来设置的,我设置的是2m用来测试(2097152 =2 * 1024 * 1024 ),设置2m是方便我测试,保证我在下面代码设置1m的MB_1对象,内存是在新生代分配,而不是直接进入老年代
  • -XX:+PrintGCDetails打印垃圾回收日志

ChenSino大约 4 分钟javajvm
通过反汇编来看String的拼接

1、先看问题,以下结果是什么?

String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
System.out.println(s1 == s2);  
System.out.println(s1 == s3);  
System.out.println(s1 == s4);  
System.out.println(s1 == s9);  
System.out.println(s4 == s5); 
System.out.println(s1 == s6); 

ChenSino大约 3 分钟javajvm字节码反汇编
mysql8搭建主从复制

1、mysql主从复制

1.1 搭建主从复制目的?

为了实现读写分离,解决数据库性能问题,读写分离中,“读”的数据是从哪里来呢?其实他是从“写”库copy过来的

1.2 使用docker搭建基于mysql8的主从复制

  1. 创建容器

    docker run --name mysql_master -p 3001:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
    

    这一步创建容器的目的是查看那以及获取mysql配置文件,然后把它的配置文件copy到宿主机,这样方便直接在宿主机修改mysql配置,如果不事先把mysql配置文件获取出来,直接用docker的-v去挂载的话会有问题,无法达到把docker容器配置映射到宿主机的目的(可能是我的方式不对)

  2. 把容器内mysql配置copy到宿主机,配置文件在/etc/mysql,直接把整个目录copy到宿主机

    docker cp 容器ID@:/etc/mysql /home/user/master #master 库的配置,路径可以自由在指定
    docker cp 容器ID@:/etc/mysql /home/user/slave  #slave库配置
    
  3. 分别修改master和slave的配置文件my.cnf,在mysqld下增加以下内容

    master配置

    [mysqld]
    ## 设置server_id,一般设置为IP最后一位,直接写ip会报错,同一局域网内注意要唯一
    server_id=100  
    ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
    binlog-ignore-db=mysql  
    ## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
    log-bin=edu-mysql-bin  
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M  
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed  
    ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7  
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062  
    

    slave配置

    [mysqld]
    ## 设置server_id,一般设置为IP最后一位,直接写ip会报错,同一局域网内注意要唯一
    server_id=101  
    ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
    binlog-ignore-db=mysql  
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=edu-mysql-slave1-bin  
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M  
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed  
    ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7  
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062  
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin  
    ## log_slave_updates表示slave将复制事件写进自己的二进制日志
    log_slave_updates=1  
    ## 防止改变数据(除了特殊的线程)
    read_only=1  
    
  4. 删除刚启动的容器,当然不删除也无所谓,我们启动它主要是获取里面的mysql配置,好方便映射出来

    docker ps #查看容器id
    docker rm -f mysql容器id
    
  5. 启动master

    
    ~~~shell
    docker run --name mysql_master -p 3001:3306 -e MYSQL_ROOT_PASSWORD=root -v /home/chenkun/DockerConfigs/mysql-cluster/master/mysql:/etc/mysql -d mysql:latest
    
  6. 查看master的状态,这一步查询结果后续第9步slave会用到

    $ mysql -h 127.0.0.1 -P 3001 -uroot -proot
    
    mysql> show master status;
    +----------------------+----------+--------------+------------------+-------------------+
    | File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +----------------------+----------+--------------+------------------+-------------------+
    | edu-mysql-bin.000003 |      396 |              | mysql            |                   |
    +----------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
  7. 在master添加一个账户,并给用户授权,目的是给slave用来从master同步数据用的(创建用户建议用navicat,因为要选择插件为mysql_native_password)

    #如果非要使用命令行创建用户使用以下命令(推荐使用navicat)
    mysql>CREATE USER 'slave'@'%' IDENTIFIED BY 'root';
    mysql>user mysql
    mysql>update user set plugin='mysql_native_password' where user = slave;
    
    mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';   # 授权给slave
    
  8. 启动slave

    # 映射到宿主机3002端口,挂载其对应的配置目录
    docker run --name mysql_slave -p 3002:3306 -e MYSQL_ROOT_PASSWORD=root -v /home/chenkun/DockerConfigs/mysql-cluster/slave/mysql:/etc/mysql -d mysql:latest
    
  9. 查看宿主机的ip,设置和master的关联(注意此处不能用localhost以及127.0.0.1,在容器中使用localhost指向的是容器而不是宿主机)

    docker inspect 容器id #在返回结果找ip,172.17.x.x
    

    172.17.0.2是master容器的ip,slave是第7步在master建立的用户,root是密码 ,edu-mysql-bin.000003和master_log_pos是第6步查询的解雇哦

    ##记得先进入先进入slave库,在mysql命令行执行以下
    mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='root', master_port=3306, master_log_file='edu-mysql-bin.000003', master_log_pos=156, master_connect_retry=30; 
    
  10. 启动slave

    mysql>start slave;
    
  11. 查看slave状态,13、14行为yes就ok了,如果连接失败在47行Slave_SQL_Running_State会报失败原因


ChenSino大约 7 分钟java部署搭建