
java
小鲁班-JAVA开发
java项目开发
展开
-
JVM对象分配过程
对象分配流程图1、依据逃逸分析,是否可以栈上分配?如果可以,则使用标量替换,把对象分配到栈空间上,如果线程销毁或方法调用结束后,自动销毁,不需要GC回收器介入。进行第3步操作。2、不满足逃逸分析,判断对象是否是大对象?如果是,直接分配到堆上 Old Generation 老年代上。如果对象变为垃圾后,由老年代GC 收集器(比如 Parallel Old, CMS, G1)回收。不是大对象,则进行第3步操作。3、判断是否可以在 TLAB中分配?如果是,在 TLAB中分配堆上Eden区。否则..原创 2021-12-28 22:17:28 · 1347 阅读 · 0 评论 -
serialVersionUID的作用
serialVersionUID是一个非常重要的字段,java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本的一致性。在进行反序列化时,JVM会把字节流中传来的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果一致,则可以进行反序列化,否则会出现序列化版本不一致的问题,InvalidClassException异常。一般来说定义InvalidClassException有两种方式①、默认的1L,private static.原创 2021-11-21 14:24:18 · 1198 阅读 · 0 评论 -
Spring中Lookup注解的使用
我们知道在spring容器中单独的一个抽象类是不能成为一个bean的,那么有没有办法呢?这个时候我们可以使用Lookup注解,我们可以看下spring的扫描bean部分逻辑。我们知道在spring中要想成为一个bean,必须先生成BeanDefinition对象,如果一个抽象类中没有含有Lookup注解的方法,在spring扫描时就会被排除掉。 /** * 1、判断是不是独立的类,非静态内部类则无法生成bean, * 2、判断是不是接口或者抽象类(有一种特殊情况),是则无法生成 * 3、判原创 2021-10-26 11:32:24 · 1006 阅读 · 0 评论 -
简单模拟手写Spring框架
只是简单的按照Spring的执行流程写了一下代码,当然跟Spring源码是有很大的差别,可以拿来学习,不喜勿碰。支持单例和原型的bean,以及初始化前、初始化、初始化后的方法执行,可以解析各种定义的注解执行流程工程机构关键代码,代码路径:xqc-structure: 模拟手写springpackage com.xqc.context;import com.xqc.annotation.*;import com.xqc.aware.XqcBeanAware;impor..原创 2021-10-17 11:06:17 · 166 阅读 · 0 评论 -
Spring推断构造方法和应用场景初步分析
1.工程结构依赖jar包<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.4.RELEASE</version> </dependency>2、将Ord.原创 2021-10-15 09:59:42 · 177 阅读 · 0 评论 -
JAVA并发三大特性
1、原子性2、可见性3、有序性原创 2021-03-28 23:23:20 · 167 阅读 · 0 评论 -
JAVA内存模型
对象头、指针类型、对齐填充原创 2021-03-28 00:35:27 · 94 阅读 · 0 评论 -
java常用的对象转map的几种方式
创建对象Userpackage com.xqc; import java.util.Date; public class User { /** * * ID */ private Integer id; /** * * 用户名 */ private String userName; /** * * 岗位ID */ private Long jobId;原创 2021-01-17 15:04:44 · 40548 阅读 · 0 评论 -
MapStruct使用和原理分析
在代码开发中,经常会遇到不同实体类之间的字段copy,以前经常用到的有通过set赋值或者apache、spring的BeanUtils.copyProperties(),原生的set赋值随便速度比较快,但是当字段多的时候,就显得比较麻烦了,每个都要自己手动set一下值,而apache、spring的BeanUtils.copyProperties()可以解决这种字段比较多的情况,但是这种方式有个弊端,就是,字段的类型和名称都必须一样才可以,否则copy时会被忽略掉。知道接触了一种新的方式,使用MapStru原创 2020-12-25 21:31:19 · 1912 阅读 · 0 评论 -
线程笔记分享
在一个进程中,多个线程可以共享进程中的相同的内存和文件资源。单线程:排队执行、在同一时间内,只能执行一个任务,CPU利用率大幅度降低,这是最大的缺点。多线程:在同一时间内可以执行多个任务、这是多线程最大的优点。实现线程的方式,继承Thread,实现Runnable接口,Thread实际上也是实现了Runnable接口,之间是多态关系,继承Thread最大的局限是java不支持多继承,所以一般建议实现Runnable接口。线程调用start方法比较耗时,大概四个步骤,1.通过jvm告诉操作系统创建T原创 2020-12-06 13:22:48 · 104 阅读 · 0 评论 -
理解SPI机制
SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。Dubbo、JDBC中都使用到了SPI机制,springboot也使用了spi机制,但是它并没有使用原生的,而是自己做了扩展。例子说明工程结构新建spi-interface工程,编写接口StuService和方法run新建spi-girl类,引入spi-interface工程依赖,StuGirlSe原创 2020-11-02 23:48:37 · 338 阅读 · 0 评论 -
DCL实现单例要不要加volatile修饰
单例模式的DCL(Double-checked locking 双重校验锁定模式)写法:public class DclSingleton { private static volatile DclSingleton dclSingleton = null; public static DclSingleton getDclSingleton(){ if(dclSingleton == null){ synchronized (DclSing原创 2020-09-28 23:15:46 · 549 阅读 · 0 评论 -
java -jar运行SpringBoot的jar提示没有主清单属性
1.新建springboot的maven工程在pom文件引入依赖包 <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <versi原创 2020-09-14 15:33:04 · 995 阅读 · 2 评论 -
springcloud+springcloud alibaba+springboot+Nacos+Seata+Mybatis+Redis开发框架
最近在使用springcloud Finchley.SR2 + springcloud alibaba 0.2.1.RELEASE + springboot 2.0.6.RELEASE+nacos1.3.1+seata0.9.0+mybatis开发时,后台启动后,seata一直报错。业务逻辑执行的时候报下面的错,找不到服务主要是配置没配好,0.9.0版本的seata跟1.0以后的使用差别还是有点大,详细配置如下1.下载seata0.9.0,地址:http://seata.io/zh-cn/b原创 2020-09-08 14:20:21 · 1235 阅读 · 0 评论 -
测试堆空间常用jvm参数
-Xms:设置初始分配大小,默认为物理内存的“1/64”-Xmx:最大分配内存,默认为物理内存的“1/4”1.设置初始堆大小:-Xms10M 或-Xms1000K原创 2020-09-05 16:25:59 · 484 阅读 · 0 评论 -
jstat -gc pid数据详解
1.首先使用jps命令,显示当前所有java进程pid2.找到对应的pid,然后使用jstat -gc pid命令,查看详细情况S0C:第一个幸存区的大小S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小EC:伊甸园区的大小EU:伊甸园区的使用大小OC:老年代大小OU:老年代使用大小MC:方法区大小MU:方法区使用大小CCSC:压缩类空间大小CCSU:压缩类空间使用大小YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间FGC:老原创 2020-09-05 10:01:57 · 8491 阅读 · 0 评论 -
JAVA线程之间如何通信
两种:1.共享内存(共享内存模型:线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来 隐式 进行通信,例如volatile)2.消息传递(消息传递模型:线程之间没有公共状态,线程之间必须通过明确的发送消息来 显式 进行通信,例如wait和notify)...原创 2020-09-02 23:07:43 · 214 阅读 · 1 评论 -
springboot+mybatis+sharding-jdbc整合分库分表实战
接上一张分库分表分析。原创 2020-08-19 10:05:45 · 3689 阅读 · 4 评论 -
分库分表分析
场景:随着公司的业务量的逐步增大,数据库的数据量也不断增加,达到百万、千万级别,甚至更多,这个时候发现传统方式的单库单表已经难以支撑业务发展,性能要求难以满足,查询耗时太久等问题,随时会导致系统奔溃。此时就需要考虑新的解决方案,一般都会想到进行分表分库之类的方法。常见分库分表工具:sharding-jdbc和mycat,其他的还有cobar、TDDL、atlas等。sharding-jdbc:当当开源的,属于 client 层方案,sql语法支持比较好,支持分库分表、读写分离、分布式 id 生成、柔性原创 2020-08-18 11:18:50 · 421 阅读 · 0 评论 -
java自定义注解(Annotation)开发
注解是jdk1.5开始提供,允许java程序在运行时读取类的注解信息运行注解的步骤:1.首先自定义Annotation注解类型2.在源代码中使用定义的注解3.在程序中使用反射读取注解信息声明一个注解的关键字@interfacepublic @interface PersonAnnotatin{ }上面我们声明了一个注解,但是并没有限定注解的相关使用@Target:指定注解的适用的目标,有以下几种,可以作用于类、方法、构造器、字段、参数等,使用的时候可以指定多个范围pub.原创 2020-08-15 15:25:58 · 543 阅读 · 0 评论 -
java时间工具类
1.日期相加减 public static Date addDate(Date date,int day){ if(date == null){ return date; } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, day); return calendar.getTime(); }2.时间加毫秒原创 2020-08-11 11:33:57 · 300 阅读 · 0 评论 -
Eureka比Zookeeper更合适作为springcloud微服务的注册中心原因
主要是因为Eureka是基于AP原则构建的,而Zookeeper是基于CP原则构建的,在分布式系统领域里有比较著名的CAP定理。C:数据一致性A:服务可用性P:服务队网络分区故障放入容错性而这三个特性在任何分布式系统中都不能同时满足的,最多同时满足两个。Zookeeper有一个Leader,而且在这个Leader无法使用时,会通过Paxos(ZAB)算法选举出一个新的Leader,而新的Leader任务就是保证写入数据时只像这个Leader写入,然后同步信息到其他几点,最终通过这个操作保证数据的一原创 2020-08-03 22:36:39 · 199 阅读 · 0 评论 -
SLF4j使用例子
SLF4j是一个简单日记门面,使得最终用户能够在部署的时候配置自己希望的loging apis实现。1.首先引入slf4j-api的jar包 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.26</version> </dependenc原创 2020-07-29 00:48:42 · 749 阅读 · 0 评论 -
Spring MVC Controller线程安全性问题分析
最近几年工作一直主要用的是SpringMvc,面试的时候这方面问的问题也比较多,平常只顾忙着按项目进度,完成开发任务,有些东西东西时间长了不去温习和回顾,面试自然栽跟头了。SpringMvc首先是基于方法的拦截,与最早流行的Struts2是基于类的拦截是不同的;SpringMvc额Controller的默认是Singleton(单例)模式。所以每一次的请求过来只会使用首次创建的实例,这样可以避免每次创建新的对象,减少垃圾对象,但是它也有弊端,最大的问题就是如果内部声明了实例变量,多线程下存在线程安全问题原创 2020-07-28 22:25:52 · 372 阅读 · 0 评论 -
HashMap初始化长度设置大小
HashMap的优化点,创建HashMap时,如果已经知道大概要放多少的数据量,可以自己设置好长度,减少扩容,提高速度。代码比较,存放3个数。不设置初始化大小private static void test1(){ long l1 = System.nanoTime(); Map<String,String> dataMap = new HashMap<>(); dataMap.put("1", "A"); dataMap.put("2", "B");原创 2020-06-18 23:25:14 · 11917 阅读 · 4 评论 -
java多线程交替打印两个数
方法1,使用wait和notifypackage com.thread;public class T01 { public static void main(String[] args) { char[] char1 = "AAAAAA".toCharArray(); char[] char2 = "BBBBBB".toCharArray(); Object object = new Object(); Thread thread1 = new Thread(() -&原创 2020-06-14 21:15:17 · 569 阅读 · 0 评论 -
Class.forName和classloader的区别分析
class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象。先了解下类加载机制,5个过程。原创 2020-06-07 17:18:50 · 1162 阅读 · 0 评论 -
java可重入锁synchronized和ReentrantLock
什么就叫可重入锁?可重入锁也叫可重复可递归调用的锁,同一线程外层函数获得锁之后,在进入内层方法的时候会自动获取锁,然后使用,无需等待去再次获取锁,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁代码简单实现,synchronized实现public class TestLock { public static synchronized void say() { System.out.println(Thread.currentThread().getName()+原创 2020-06-06 21:09:58 · 142 阅读 · 0 评论 -
java双亲委派机制
什么叫双亲委派机制?,首先需要了解一下ClassLoader,在java工具开发的源码,会被编译器编译成.class字节码文件,然后由ClassLoader负责将这些class问价加载到JVM中去执行。JVM中提供了三层的ClassLoader:Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。Ap.原创 2020-05-29 13:30:59 · 93 阅读 · 0 评论 -
java常见的敏感异常
1、java.io.FileNotFoundException:泄露文件系统结构和文件名列举2、ava.util.jar.JarException:泄露文件系统结构3、java.util.MissingResourceException:资源列举4、java.security.acl.NotOwnerException:所有人列举5、java.util.ConcurrentModificationException :可能提供线程不安全的代码信息6、javax.naming.Insufficien原创 2020-05-10 20:35:36 · 16527 阅读 · 0 评论 -
java中使用redis
1.首先需要引入jedis的jar包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.1.0</version> </dependency>...原创 2019-12-09 23:03:46 · 175 阅读 · 0 评论 -
分布式锁的3种具体实现方式
3种实现方式:1.基于数据库实现分布式锁2.基于缓存(Redis等)实现分布式锁3.基于Zookeeper实现分布式锁1.数据库方式实现1、数据库实现分布式锁:在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。1)创建一个表:method_lockCREA...原创 2019-12-09 18:29:06 · 162 阅读 · 0 评论 -
Lambda表达式语法
lambda表达式基本语法1.声明:和lambda表达式绑定的接口类型2.参数:包含在括号中,和绑定的接口中的抽象方法中的参数个数和顺序保持一致3.操作符:->4.执行代码块:包含在一对大括号中lambda语法规则格式如下[接口声明] = (参数) -> {执行代码块}1.没有参数。没有返回值的lambda表达式像这种没有参数,只有一行输出的lambda可以简化为,省略...原创 2019-11-22 00:10:59 · 571 阅读 · 0 评论 -
自定义lambda表达式函数式编程
1.接口上标明注解@FunctionalInterfacepublic interface MessageFac { boolean empty(String str);}注意:接口里面只能生命一个抽象方法,否则会报错,如下图使用自己定义的表达式...原创 2019-11-21 23:30:12 · 444 阅读 · 0 评论 -
Lambda表达式创建线程
1.传统方式创建一个线程 /** * 传统方式 */ private static void thread01(){ new Thread(new Runnable() { @Override public void run() { //业务代码 System.out.println("传统方式创建线程-》"+Thread.currentTh...原创 2019-11-21 23:00:16 · 7135 阅读 · 0 评论 -
ArrayUtils和Arrays比较常用的方法推荐
Arrays属于rt.jar中java.util包下面的类,不需要引入其他外部jar,而ArrayUtils属于commons-lang.jar中org.apache.commons.lang3包下下面的类,要想使用此类需要引入包。一.Arrays方法介绍 1.asList方法,很方便的讲一个对象转为List集合使用,但是此方法转成的List集合有个坑,那就是转成的List并不是新建j...原创 2019-11-08 10:11:47 · 1965 阅读 · 0 评论 -
@WebListener 不起作用
分享一下今天遇到在监听器上面加注解@WebListener不起作用的问题<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sc...原创 2019-10-30 09:26:17 · 1958 阅读 · 0 评论 -
@JSONField 注解详解和应用
通常我们java类里的字段的命名都是按照驼峰规则来的,但是有些不按套路的或者命名不规范的人,就会出现各种奇葩的情况。最近在项目上就遇到了奇葩的几种情况,一种是类似create_user_id,另一种是PODocNo,还有TotalWeight等。 由于我们是下游系统,要接收上游传过来的数据,正常情况我们都会按照驼峰规则去建立字段,然后使用JSONObject.p...原创 2019-10-15 10:19:36 · 2116 阅读 · 0 评论 -
WebSocket实时推送消息
废话不多说,直接上代码,本人亲自测试,可以使用。前台js代码:var websocket;var path = window.location.host+"/web-socket";// 首先判断是否 支持 WebSocketif('WebSocket' in window) { websocket = new WebSocket("ws://"+path+"/ws");...原创 2018-10-30 10:09:36 · 446 阅读 · 0 评论 -
java实现Http请求
以下代码是本人在实际工作中总结出来的,个人感觉还是比较精简干练的,get请求key=value格式报文 public static String getMethod(String url,Map<String,Object> dataMap) throws Exception{ CloseableHttpClient httpClient = null; Clos...原创 2018-11-01 11:06:41 · 351 阅读 · 0 评论