- 博客(56)
- 收藏
- 关注
原创 jvm虚拟机调优实战
大量的job,部分用户点击的热数据 ,不同时刻在跑 600-700对比 200 多了400-500m,代码原数据(不占用堆区)占了300m,所以 堆空间=老年代(900)+700+7 约等于 1500-1600m。heap out of range: full gc =>old 不能变大(young 足够小)=》full gc后不能增大old的空间 容不下新来的数据。full gc 过程: 15次=》old =>old大=》young变小=》young持续小=》young gc 频繁=>full gc。
2024-10-16 16:56:47 824
原创 集群系统架构
ShedLock 是一个用于分布式环境下的锁机制,确保在同一时间点只有一个节点能够执行特定的定时任务。其核心原理是通过公共存储(如数据库、Redis 等)来实现锁的管理12。具体来说,当一个任务在某个节点上开始执行时,该节点会在公共存储中记录锁的信息,包括任务名称、锁定时间和锁定的节点等。如果其他节点尝试执行同一任务,它们会检查公共存储中的锁信息,如果发现任务已经被锁定,则会跳过执行34。ShedLock 的实现步骤通常包括以下几个方面12:引入依赖:在项目中添加 ShedLock 相关的依赖库。
2024-09-26 10:42:30 520
原创 数据库时区问题
查询数据时,当使用Date格式作为查询条件时,会增加8小时,所以使用JsonFormat格式应使用注解:查看mysql时区 SELECT @@global.time_zone;可以看到使用的全局时区是system,也就是系统时区。我们mysql所在windows系统,采用东8区。所以如果不加日期时区信息,JsonFormat格式化是序列化即前台向后台传递,传递的数据会被认为是utc时间,到java后台如果不加时区就会比实际大8小时,插入到数据库的时间转化后会大8小时。
2023-08-03 13:53:37 220
原创 程序基本功:排序算法经典算法
快速排序:import org.junit.Assert;import org.junit.Test;import java.util.Arrays;public class Sort { int[] initNums = {2, 45, 23, 11, 45, 3, 88, 19, 55, 109, 1998, 1, 26, 46, 67, 99}; @Test public void getFinalNum() { testAlgorithm(ini
2021-03-23 14:00:29 212
原创 数据库
阿里规范中有关数据库索引的规定:【强制】超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询时, 保证被关联的字段需要有索引。说明:即使双表 join 也要注意表索引、SQL 性能。 【强制】业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。【推荐】如果有order
2021-01-14 15:47:38 236
原创 字节数组和基本类型转换
基础知识boolean 一位byte 8位 一个字节short char 2个字节int float 4个字节double long 8字节java是unicode编码,一个char可以占两个bai字节,可以存储一du个汉字。一个String,要zhi看有几个字母或者dao几个汉字,一个英文字母就是一个字节,一个汉字就是两个字节,以此类推计算。带符号按位左移 << 带符号右移>> 不带符号右移 >>>1.内存中的位运算,都会先转换成int,4个字节
2020-12-22 16:13:45 2226
原创 运维
8.0以后的mqsqlCREATE USER 'root'@'%' IDENTIFIED BY '你的密码'; GRANT ALL ON *.* TO 'root'@'%'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';FLUSH PRIVILEGES;
2020-12-15 11:39:44 126
原创 Netty
一个Chennel信道包括一个pepeline管道。可以有多个ChannelHandlerContext信道处理者上下文,成员变量包含ChannelHandler信道处理者 ,并实现了ChannelInboundInvoker(入口信道调用者),看以下方法public interface ChannelInboundInvoker { /** * A {@link Channel} was registered to its {@link EventLoop}. *
2020-12-04 14:21:19 162
原创 ReferenceQueue与Reference
Reference的enqueue()方法 public boolean enqueue() { return this.queue.enqueue(this); }ReferenceQueue 的enqueue方法 boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */ synchronized (lock) {
2020-11-16 10:53:07 416
转载 java Type分类:GenericArrayType TypeVariable WildcardType ParameterizedType Class
java范型参数
2020-11-12 19:21:51 1561 3
原创 完美解决FastJson出现 com.alibaba.fastjson.JSONObject cannot be cast to model的bug
/** * 将map转list * * @param maps map * @param clazz clazz * @param <T> T * @return list * @throws NoSuchMethodException * @throws IllegalAccessException * @throws InvocationTargetException * @throw.
2020-11-12 16:41:45 2663 3
原创 自定义工具类:数据统计处理四分位数据,日期工具类
public class Tools { private static final double oneDayLong = 24 * 60 * 60 * 1000;// 一天时间 private static final double oneWeekLong = 7 * oneDayLong;// 一周的时间 private static final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); p
2020-11-07 11:10:06 137
原创 flink入门
@SpringBootTest@SuppressWarnings("deprecation")class FlinkbizApplicationTests { @Test void contextLoads() throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelis
2020-11-04 17:08:44 482
原创 Enum类型
package cmtech.soft.biz.utils.model;import cmtech.soft.biz.utils.MyStrTool;/** * 工单状态 */public enum WorkOrderStatus { CREATED("created", "未开始生产"), RUNNING("running", "生产开始"), PAUSED("paused", "生产暂停"), ENDED("ended", "生产结束"); pri
2020-09-25 13:52:09 138
转载 java 闭包与lambda
https://developer.ibm.com/zh/articles/j-java8idioms10/[闭包]
2020-09-23 14:34:00 183
原创 mqtt的使用 broker:EMQ
MqttConfig类package cm.soft.collect.config;import cm.soft.collect.biz.CollectBiz;import cm.soft.collect.service.OnMqttCallBack;import org.eclipse.paho.client.mqttv3.*;import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;import org.springfr
2020-09-11 13:47:15 1228
原创 线程工具类
自定义线程package cm.soft.collect.threadUtil;import java.util.Queue;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.locks.LockSupport;/** * 仿照线程池的形式封装一个任务队列存放没有完成的老任务 */public class CustomThread extends Thread { private
2020-09-11 13:44:12 175
原创 字符串工具类
package cmtech.soft.equipment.utils;import cmtech.soft.equipment.utils.Aop.InterceptAction;import com.bestvike.linq.Linq;import org.joda.time.DateTime;import java.text.SimpleDateFormat;import java.util.*;public class MyStrTool { /** * 根据
2020-09-11 13:39:24 211
原创 集合工具类
package cmtech.soft.equipment.utils;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;import java.util.function.Function;import java.util.stream.Collectors;/** * 集合工具类 * * @param <T> 范型 */pub
2020-09-11 13:38:06 109
原创 函数式引用
所谓方法引用,是指如果某个方法签名和接口恰好一致,就可以直接传入方法引用。方法签名只看参数类型和返回类型,不看方法名称,也不看类的继承关系。不论方法是静态方法还是实例方法。FunctionalInterface允许传入:接口的实现类(传统写法,代码较繁琐);Lambda表达式(只需列出参数名,由编译器推断类型);符合方法签名的静态方法;符合方法签名的实例方法(实例类型被看做第一个参数类型);符合方法签名的构造方法(实例类型被看做返回类型)。FunctionalInterface不强制继承关系
2020-09-10 14:41:20 334
原创 值类型和引用类型
通过查看源码forEach的源码是增强for说明增强for不是对源数据的修改,是对原来集合的拷贝。package com.example.test;import java.util.ArrayList;import java.util.List;import java.util.Optional;public class TestOptional { public static void main(String[] args) { List<Student>
2020-09-09 14:27:27 171
原创 java的回调
使用Mqtt的时候用到了回调,消息到达和连接上时触发回调函数的执行。java的回调类似于C#中的委托,事件。和函数接口,函数式接口(@FunctionalService),lambda紧密相关。一些常用的设计模式如发布订阅模式都使用了委托。一个含有委托类的类负责委托中函数的触发时机,委托类的函数的具体执行,放到实现委托类接口的类中实现。这样就减少了耦合性,灵活性,可以实现更复杂的功能。下边自己实现一个智能温控计的功能,使用回调实现,到达报警温度时,停止加热并报警的功能。先上回调类,用一个函数式接口实
2020-08-29 13:37:16 239
原创 AQS:AbstractQueuedSynchronizer(队列同步器)
分析下边两个比较绕的方法: /** * Inserts node into queue, initializing if necessary. See picture above. * @param node the node to insert * @return node's predecessor */ private Node enq(final Node node) { for (;;) { Node
2020-08-19 20:59:35 349
转载 转:LockSupport 及Unsafe
concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类:Unsafe(提供CAS操作) LockSupport(提供park/unpark操作) 因此,LockSupport非常重要。park函数是将当前调用Thread阻塞,而unpark函数则是将指定线程Thread唤醒。两个重点(1)操作对象Thread归根结底,LockSupport.park()和LockSupport.unpark(Thread thread)调用的.
2020-08-18 13:35:15 217
原创 java retry的作用:小实验
package com.example.test;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestApplicati
2020-08-14 14:29:57 170
原创 Java设计模式:代理模式
使用代理模式来实现数据库连接池,代码部分转自廖雪峰的官方网站代理模式我的理解是:代理类继承了被代理类。存储了真正的被代理类对象的访问钥匙或途径,封装在代理类的变量中,代理类可以有自己的功能,如鉴权等一些操作,等到真正需要用时才用钥匙获取被代理对象。定义抽象类(可以不实现接口中方法)执行被代理类中对应方法可以作为访问的钥匙,此方法在代理类中没有,于是去找父类被代理类中的此方法,这个方法引用又需要到代理类中获取,先到父类,又到子类,用了继承和多态两个特性...
2020-08-11 12:50:59 149
原创 设计模式:单例和抽象工厂
单例模式:全局只允许有一个实例对象,可以有饿汉和懒汉式抽象工厂:工厂和产品有多个,产品接口可以派生出多个产品,根据不同产品的组合可以派生出多个工厂。只关心想要的产品,不用关心工厂创建和产品生产的过程,将这个过程隐藏在程序内部。工厂方法:常用静态方法来实现。自己写的一个将工厂模式和单例模式结合起来的实例,工厂是单例,产品的获取用工厂模式。定义产品接口:可以吃的接口package com.example.designModel.factory;public interface IEat {
2020-08-10 17:08:27 339
转载 转:数据库的乐观锁和悲观锁
悲观锁当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。定义:这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)。悲观锁认为并发下同一条数据被修改的可能性比较大。处理加锁的机制会让数据库并发效率降低,浪费CPU、服务器资源(一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。),还有增
2020-08-07 13:45:15 291 1
转载 转:Spring循环依赖及解决方式
https://blog.csdn.net/YeaiqFeng/article/details/89057194
2020-08-07 12:28:38 141
原创 Spring Boot的多线程
Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解声明其是一个异步任务。此外,还提供一种Java的实现方式,多种方式去尝试如何去实现多线程。一、基于Spring注解定义配置类import java.util.con
2020-08-06 14:55:48 318
原创 JVM内存模型、对象结构、JVM性能优化
jvm内存模型模型图各个内存块存放内容JVM内存结构主要有三大块:堆(heap space)、方法区(method area)、本地区(native area)。堆内存堆内存(heap space)存放所有线程共享的对象和数组。在虚拟机启动时创建,Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。GC回收的策略是按代回收。对象在实例化后的整个运行周期内,都被存放在堆内存中。堆内存又被划分成不同的部分:是JVM中最大的一块由年轻代(Young Generation S
2020-08-04 14:08:27 406
原创 java类加载和初始化
什么是类的加载类加载:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类预加载:类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇
2020-07-31 18:39:03 893
原创 零散知识点
1.如果不想通过构造方法产生对象,那么可以将构造方法声明为private2.如果父类只有有参构造方法,那么子类必须也有这个有参构造方法,因为要构造出子类必须先构造出父类。
2020-07-29 17:18:29 123
原创 java设计模式:发布订阅模式(观察者模式)
定义一个产品package com.example.observer;public class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public dou
2020-07-29 16:36:14 666
原创 java多线程:Future模式
Request-Per-Task每个请求一个任务可以实现异步任务,但是不能获取任务的结果,Future模式可以获取异步任务的结果一个Data的接口package com.FutureExample;public interface Data { public abstract String getContent();}RealData实现Data,构造方法延时产生真正数据,包含获取真正的数据getContent方法package com.FutureExample;publ.
2020-07-28 09:16:53 850
原创 java多线程:每个请求(任务)一个线程 模式Thread-Per-Task(request)和线程池模式
一次请求分配给一个线程public class ThreadAssign{ public void assign(Object... obj){ new Thread(){ public void run(){ ... }.start(); } }}
2020-07-15 21:50:32 1044
原创 java多线程:Readers-Write模式读写分离
多个线程读不会冲突;多个线程读的时候,别的线程不能写;一个线程写的时候,其他线程不能读使用public class Data{ private final ReadWriteLock lock=new ReadWriteLock(); public void read(){ lock.readLock(); try{ // ... }finally{ lock.readUnlock(); } } public void write(){ lock.w.
2020-07-15 21:39:47 135
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人