java - jackssybin 的个人博客
java (18)
Java垃圾回收期Cms和G1梳理
springboot升级swagger-ui进化版knife4j简单集成
1.官方文档 knife4j接入文档 2.概述 引入基础包,如果老项目以前有swagger做doc文档。那就省事了。可以直接引入新ui包 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> 新ui包 ,我用的 lastVersion =1.9.6 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>${lastVersion}</version> </dependency> 3.配置相关 其实就是swagger的配置哈 @Conf....
Centos7时间和java获取时间不一致
问题描述 遇到一个问题,web显示的时间比服务器时间快12小时。Tomcat和MySQL安装在同一台服务器,系统是centos7,且服务器时间和MySQL时间一致,均是当前北京时间。 解决思路 1、在程序中使用java的函数设定时区。 2、在启动java程序时加参数-Duser.timezone=GMT+8 3、修改/etc/sysconfig/clock文件,然后重启服务。 (PS:jre是从/etc/sysconfig/clock这个文件中获取时区信息的) 附/etc/sysconfig/clock文件内容: #设置上海时区 ZONE="Asia/Shanghai" UTC=false ARC=false ## ZONE -- 时区 ## UTC -- 表明时钟设置为UTC。 ## ARC -- 仅用于alpha表明使用ARC。 4、修改MySQL连接参数 jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior....
java触发gc的条件和时机
1.什么时候触发GC (1)程序调用System.gc时可以触发,也不是立即触发,只是发了个通知要触发,时机由jvm自己把握 (2)系统自身来决定GC触发的时机(根据Eden区和From Space区的内存大小来决定。当内存大小不足时,则会启动GC线程并停止应用线程) GC又分为 minor GC 和 Full GC (也称为 Major GC ) Minor GC触发条件:当Eden区满时,触发Minor GC。 Full GC触发条件: a.调用System.gc时,系统建议执行Full GC,但是不必然执行 b.老年代空间不足 c.方法区空间不足 d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存 e.由E....
idea永久激活使用(2020/01/06更新亲测可用,采用探针修改) 有更新!
1.下载补丁 链接:https://pan.baidu.com/s/1oYtDSei3R93S6sDRR1WiyQ 提取码:h2na 下载解压到idea的bin目录 2.修改IDEA的bin目录中的配置文件 修改 俩文件的探针位置 idea.exe.vmoptions idea64.exe.vmoptions 为自己本机的正确位置 #我的位置是这个 -javaagent:D:\java\IntelliJIDEA20182\bin\ideaCrack-release-enc.jar 3.打开IDEA,在activecode中输入如下 KNBB2QUUR1-eyJsaWNlbnNlSWQiOiJLTkJCMlFVVVIxIiwibGljZW5zZWVOYW1lIjoiZ2hib2tlIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IiIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiSUkiLCJ....
java对象不再使用时,为什么要赋值为 null
1.示例代码 我们来看看一段非常简单的代码: jvm配置参数: -verbose:gc -XX:+PrintGC public static void main(String[] args) { if (true) { byte[] placeHolder = new byte[64 * 1024 * 1024]; System.out.println(placeHolder.length / 1024); } System.gc(); } 我们在if中实例化了一个数组placeHolder,然后在if的作用域外通过System.gc();手动触发了GC,其用意是回收placeHolder,因为placeHolder已经无法访问到了。来看看输出: 65536 [GC (System.gc()) 73404K->67241K(251392K), 0.0013637 secs] [Full GC (System.gc()) 67241K->67073K(251392K), 0.0064233 secs] 本次GC后,内存占用从67241K降到了67073K。意思其实是说G....
阿里云Ubuntu16.04安装Java8_redis 有更新!
一、java8安装 1 Java 8 下载地址 链接:https://pan.baidu.com/s/1NN4XBL5g1Xn7EwzM4YET0g 提取码:m4mq 2 以root用户登录将下载的jdk-8u92-linux-x64.tar.gz文件放到~/data/soft/目录下,使用如下命令解压 tar zxvf jdk-8u92-linux-x64.tar.gz -C ~/data/soft 3 将java目录添加到etc/profile文件中 export JAVA_HOME=/root/data/jdk1.8 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH 4 验证java java -version 二、redis安装 安装Redis服务器端 sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,我们检查Redis服务....
mybatis,mysql的时区问题 有更新!
1.公司运营装mysql的时候的时区不是固定的,随机的,所以我们要想办法解决这个问题,应该运营的权限控制的很严,不能要他们更改; 首先解决从数据库读取到java,指定我们所需要的时区,只需要在配置文件的mysql链接的时候指定自己所需的文 datasource.jdbcUrl=jdbc:mysql://xxx.xx.xx.xx:3306/bms?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai 2.如果我们写接口的时候使用的JsonFormat注解的时候,我们也需要指定想同的时区,否则又会出现时区误差 @JsonFormat(pattern = ApplicationConstants.DATE_FORMAT,timezone="GMT+8")
IO多路复用机制详解 有更新!
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: 一. 同步阻塞IO(Blocking IO):即传统的IO模型。 二. 同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 三. IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。 四. 异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。 同步和异步的概念描述的是用户线程与内核的交互方式: 同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行; 异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。 阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式: 阻塞是....
java解决Hash碰撞冲突方法总结
1.什么是hash碰撞 对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰撞冲突。如下将介绍如何处理冲突,当然其前提是一致性hash。 为什么hashcode会相同? hashCode是所有java对象的固有方法,如果不重载的话,返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同。 hashCode的重载实现需要满足不变性,即一个object的hashCode不能前一会是1,过一会就变成2了。hashCode的重载实现最好依赖于对象中的final属性,从而在对象初始化构造后就不再变化。一方面是jvm便于代码优化,可以缓存这个hashCode;另一方面,在使用hashMap或hashSet的场景中,如果使用的key的hashCode会变化,将会导致bug,比如放进去时key.hashCode()=1,等到要取出来时key....
java基础知识需要注意的一些点 有更新!
1.看看Integer 你注意到了没 @Test public void testInteger() { System.out.println(("----- testInteger method test ------")); Integer a =128; Integer b =128; System.out.println(a.equals(b)); System.out.println(a==b); Integer c =127; Integer d =127; System.out.println(c.equals(d)); System.out.println(c==d); } 结果: true false true true 为什么? Integer类型当正整数小于128时是在内存栈中创建值的,并将对象指向这个值, 这样当比较两个栈引用时因为是同一地址引用两者则相等。 当大于127时将会调用new Integer(), 两个整数对象地址引用不相等了。 这就是为什么当值为128时不相等,当值为100时相等了。 2.看看 变量传值的问题 @Test public vo....
如何定位java进程中使用最耗内存的进程 有更新!
1.清除进程和线程的关系 2.知道linux查看进程对应线程的命令 查看进程命令 ps -ef |grep java 查看进程对应线程命令 top -Hp <pid> 找到最大线程的pid号 3.打印堆栈信息 jstack <pid> jstack 里面存的是16进制的数字。所以需要把十进制转换为16进制 printf "%x\n" pid jstack pid |grep 'nid' -C5 –color 找到了16进制的pid号。那就直接可以在jstack里搜索找到对应进程信息了,就能找到对应的代码了 生成dump文件: jmap -dump:format=b,file=/path/heap.bin 进程ID jmap -dump:live,format=b,file=/path/heap.bin 进程ID live参数: 表示我们需要抓取目前在生命周期内的内存对象,也就是说GC收不走的对象,然后我们绝大部分情况下,需要的看的就是这些内存。而且会减小dump文件的大小。 4.案例 背景 1、java 正则表达式回溯造成 CPU 100% ....
终极分库分表方案 有更新!
一、数据库瓶颈 1、IO瓶颈 2、CPU瓶颈 二、分库分表 三、分库分表工具 四、分库分表步骤 五、分库分表问题 六、分库分表总结 七、分库分表示例 一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。 在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。 1、IO瓶颈 第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。 第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。 2、CPU瓶颈 第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。 第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表。 二、分库分表 1、水平分库 1.概念:以字段为依据,按照一....
永远记不住不清楚的知识点java 有更新!
java基础,高并发,面试
Java虚拟机(JVM)你只要看这一篇就够了!垃圾回收器(2) 有更新!
Java虚拟机(JVM)你只要看这一篇就够了!(1)
- Java 内存区域与内存溢出异常 1.1 运行时数据区域 根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。 1.1.1 程序计数器 内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成 如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。 1.1.2 Java 虚拟机栈 线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储
局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。 局部变量表:存放了编译期可知的各种基本类....
1.springboot+mybatisplus+generate 自动生成 有更新!
1.官网生成springboot https://start.spring.io/ 2.mybatis-plus官网生成 mybatis-plus官网快速开始 3.spring boot 增加mysql,druid 相关 4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.6.RELEASE com.jackssy.boot JFullStack 0.0.1-SNAPSHOT jfullstack Demo project for Spring Boot <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.ver....