Java
文章平均质量分 58
chengbinbbs
这个作者很懒,什么都没留下…
展开
-
大数据优化技巧
前期该系统是作为一个备用系统开发的,也就没有那么多讲究,重构了两次,现在支持对账数据量多少的瓶颈完全在 Redis 了,目前将近千万级别订单量的对账,使用服务器内存高峰在 2G 左右。现在二期对账系统的开发(一期对账系统和二期对账系统是分开的,不是重构)也在进行中了(针对亿级别订单量的对账),在后面会出如何完成日千万级别以上的订单对账(二)。对账的基本 5 大步骤,按照正常的对账来走,基本离不开下面这 5 个步骤\1. 数据加载(数据的缓存是不可少的,需要重新对账的情况很常见)\2. 数据对比(分转载 2020-12-30 18:25:56 · 1381 阅读 · 0 评论 -
plantuml使用教程
Table of Contents前言什么是PlantUML在Emacs里配置PlantUML(参考:Run it from Emacs)其他软件里的PlantUML下载和安装如何使用顺序图(Sequence Diagram)简单示例注释语句申明参与者使用非字母的参与者名称(Use non-letters in participants)发送消息给自己(Message ...转载 2020-05-08 15:39:39 · 6778 阅读 · 0 评论 -
ArrayList数组为什么要用transient修饰?
ArrayList数组为什么要用transient修饰?序列化我们知道对象是不能直接进行网络传输的,必须要转化为二进制字节流进行传输。序列化就是将对象转化为字节流的过程。同理,反序列化就是从字节流构建对象的过程。对于 Java 对象来说,如果使用 JDK 的序列化实现。对象只需要实现 java.io.Serializable 接口。可以使用 ObjectOutputStream() 和 ...原创 2020-04-16 18:11:53 · 2794 阅读 · 4 评论 -
OOM 常见原因及解决方案
当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。1、Java heap space当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMemoryError:Javaheap space 错误(根据实际生产...转载 2020-01-15 20:16:32 · 385 阅读 · 0 评论 -
几百万数据放入内存不会把系统撑爆吗?
在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存...转载 2020-01-15 15:38:34 · 1856 阅读 · 0 评论 -
DateUtil工具类
基于java8日期函数的DateUtil工具类:import java.text.SimpleDateFormat;import java.time.*;import java.time.format.DateTimeFormatter;import java.time.temporal.ChronoUnit;import java.util.Date;import java.util...原创 2019-12-20 10:41:21 · 738 阅读 · 0 评论 -
JVM线上监控工具
前言通过上一篇的 JVM 垃圾回收知识,我们了解了 JVM 具体的 垃圾回收算法 和几种 垃圾回收器。理论是指导实践的工具,有了理论指导,定位问题的时候,知识和经验是关键基础,数据可以为我们提供依据。在线上我们经常会遇见如下几个问题:内存泄露;某个进程突然 CPU 飙升;线程死锁;响应变慢。如果遇到了以上这种问题,在 线下环境 可以有各种 可视化的本地工具 支持查看。但是一旦到 ...转载 2019-12-09 16:31:33 · 1378 阅读 · 0 评论 -
JVM参数详解
一、参数分类.标准参数功能和输出的参数都是很稳定的 在未来的JVM版本中不会改变 可以使用java -help检索出所有的标准参数X参数非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始 可以使用java -X检索 但是注意没有-XcompXX参数非标准 很长一段时间不会列出来 用于JVM开发的debug和调优二、常用参数1.GC信息打印-verbose:gc开启...原创 2019-12-09 16:28:37 · 844 阅读 · 1 评论 -
JVM调优
JVM调优一.CPU过高1.查看jvm的进程ID,可以通过jps或者psjps -lvmps -ef | grep Test2.找出该进程内最耗费CPU的线程top -Hp 2444linux下,所有的java内部线程,其实都对应了一个进程id,也就是说,linux上的sun jvm将java程序中的线程映射为了操作系统进程3.将线程ID转化为16进制printf “%x\n” ...原创 2019-12-09 16:24:38 · 204 阅读 · 0 评论 -
Java 1.8 常用GC参数速查表
Java 1.8 常用GC参数速查表GC信息打印-verbose:gc开启输出JVM GC日志-verbose:class查看类加载信息明细-XX:+PrintGCDetailsGC日志打印详细信息-XX:+PrintGCDateStampsGC日志打印时间戳信息-XX:+PrintHeapAtGC在GC前后打印GC日志-XX:+PrintGCApplicationStop...转载 2019-12-09 14:47:44 · 430 阅读 · 0 评论 -
GC原理和性能调优
前言本文介绍 GC 基础原理和理论,GC 调优方法思路和方法,基于 Hotspot jdk1.8,学习之后你将了解如何对生产系统出现的 GC 问题进行排查解决。正文本文的内容主要如下:GC 基础原理,涉及调优目标,GC 事件分类、JVM 内存分配策略、GC 日志分析等CMS 原理及调优。G1 原理及调优GC 问题排查和解决思路1. GC 基础原理1.1. GC 调优目标大...转载 2019-12-09 14:45:48 · 428 阅读 · 0 评论 -
java8日期
由于传统的Date,Caleandar,SimpleDateFormat都是可变的,线程不安全的,多线程环境下需要考虑线程安全问题。而java8推出的新的日期API很好的解决了线程安全问题,而且操作简单,绝对优雅。一、常用API1.LocalDateTimejava8中将时间和日期进行了区分,用LocalDateTime表示日期和时间,LocalDate表示日期,LocalTime表示时间。...原创 2019-12-05 18:05:19 · 222 阅读 · 1 评论 -
LinkedList源码详解
我们知道ArrayList是基于数组实现的,LinkedList底层是基于链表实现的。学习过C++的人应该知道链表是一种线性存储结构,链表中一个存储单元不仅会存储数据,还会存储下一个节点的地址。而LinkedList是一种双向链表,双向链表的特点是: 1.一个存储单元中,除了存储数据之外,还会存储上一个节点的地址和下一个节点的地址,通过这个地址可以快速找到上一个节点和下一个节点; 2.双向链表原创 2018-02-01 14:22:54 · 183 阅读 · 0 评论 -
java线程池
一、什么是线程池?线程池是用于创建和管理线程的容器,可以提高系统的资源利用率。线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用。因为每启动一个新线程都会有相应的性能开销,每个线程都需要给栈分配一些内存等等。JDK1.5之后java.util.concurrent包下新增了一个工厂类Executors用于线程池的创建。二、线程池创建java在在Executors类里...原创 2019-01-30 19:52:52 · 288 阅读 · 0 评论 -
记一次生产多线程调优
一、问题在某次促销活动之前,突然收到生产环境的报警,有个后台应用出现了大量的YGC,赶紧查看系统监控日志,没有什么异常,那是什么原因呢?二、问题排查1.登录跳板机,通过top命令查看,有个java的进程CPU占用率过高,ps -ef |grep java发现是应用的进程。2.通过top -Hp pid可以找出该进程内最耗费CPU的线程。3.执行printf “%x\n” 线程ID,将线...原创 2019-01-30 20:13:38 · 149 阅读 · 0 评论 -
如何合理设置线程池大小
要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析:任务的性质:CPU密集型任务、IO密集型任务、混合型任务。 任务的优先级:高、中、低。 任务的执行时间:长、中、短。 任务的依赖性:是否依赖其他系统资源,如数据库连接等。性质不同的任务可以交给不同规模的线程池执行。对于不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配...转载 2019-04-05 10:50:16 · 2001 阅读 · 0 评论 -
Java 反射基础
一、什么是反射反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。总而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。反射的核心是 JVM 在...转载 2019-04-03 20:20:23 · 186 阅读 · 0 评论 -
使用Guava cache构建本地缓存
前言最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错。简单易上手的api;灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它。仅以此博客记录我在使用过程中的点滴。什么是本地缓存在我们的应用中,大部分的计算是昂贵的,而且是可复用的,并且计算结果不会经常发生改变。这时候我们就可以将这些昂贵的计算结果缓存到内存中,下次使用的时候直接取出即...转载 2019-07-10 10:32:00 · 625 阅读 · 0 评论 -
gRPC编码初探(java)
背景:gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次...转载 2018-07-02 17:01:01 · 1706 阅读 · 0 评论 -
反射结合动态代理实现切面编程
反射结合动态代理以简单的增删改查为例: 定义接口类IUserDao:interface IUserDao { void insert(User user); void delete(Long id); void update(User user); User select(Long id);}具体的实现类UserDao:publi原创 2018-02-02 17:31:32 · 335 阅读 · 0 评论 -
反射
什么是java反射机制? 当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射。一、Class类什么是Class类? 在面向对象的世界里,万事万物皆是对象。而在java语言中,static修饰的东西不是对象,但是它属于类。 普通的数据类型不是对象,例如:int a = 5;它不是面向对象,原创 2018-02-02 16:37:11 · 159 阅读 · 0 评论 -
泛型
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者原创 2018-02-02 14:38:28 · 148 阅读 · 0 评论 -
HashMap源码详解
HashMap是一种常用的K-V键值对的存储结构,它的特点是: 1.key和value都允许为空 2.允许重复数据,key相同的话,value会覆盖 3.集合中元素是没有顺序的 4.线程不安全的结合这些特点来看看它的源码实现:数据结构HashMap的基本数据结构是一个内部类Entry,由key、value、next、hash等变量组成,next指向下一节点, 可以看出En原创 2018-02-01 18:19:54 · 154 阅读 · 0 评论 -
ArrayList源码解析
ArrayList源码解析集合是java中非常重要且基础的内容,集合的作用就是以一定的方式来组织、存储数据。ArrayList是常用的结合之一。集合特点可以允许空可以有重复数据集合内容是有序的线程不完全的数据结构ArrayList底层是动态数组方式实现的,数据结构就是数组,之所以叫动态数据,是因为数组的容量是不固定的,add、remove操作可能会 引起原创 2018-01-05 16:54:05 · 192 阅读 · 0 评论 -
java基本类型与引用类型
java基本类型与引用类型目录java基本类型与引用类型目录一基本数据类型二引用类型三基本类型与引用类型的区别默认值内存分配自动装箱自动拆箱自动装箱拆箱带来的问题程序的性能空指针异常对象相等比较时一、基本数据类型java中一共分为8种基本数据类型:byte、short、int、long、float、double、char、b原创 2018-01-04 17:30:32 · 22839 阅读 · 10 评论 -
Spring返回日期格式化
利用ORM数据访问层框架,查询出来的数据绑定到对象上,对于时间类型会绑定到Date类型, 我们知道Date类型的数据转成json会自动转化为时间戳,如果我们想转化为字符串怎么办?1、利用SimpleDateFormatnew SimpleDateFormat(“yyyyMMdd”).format(date);2.利用fastjson的@JSONField注解“` @JSONField(forma原创 2017-08-08 19:32:47 · 1765 阅读 · 0 评论 -
正则匹配校验身份证、手机号、邮箱
比较全的正则验证,包括手机号、邮箱、身份证、银行卡号、特殊字符、中文字符校验等,直接上代码:import java.util.regex.Pattern;/** * 正则表达式验证校验邮箱、手机号等 * @author zhangcb * */public class RegexUtils { /** * 正则表达式:验证非法字符 */ public s原创 2017-01-17 18:00:55 · 923 阅读 · 0 评论 -
java注解
Java1.5引入了注解,当前许多java框架中大量使用注解,如Hibernate、Jersey、Spring。 注解作为程序的元数据嵌入到程序当中。注解可以被一些解析工具或者是编译工具进行解 析。我们也可以声明注解在编译过程或执行时产生作用。它还可以作用于程序运行过程中、 注解解释器可以通过注解决定程序的执行顺序。JDK 基本Annotation 注解 说明原创 2018-02-02 18:37:42 · 192 阅读 · 0 评论 -
Lamaba表达式二
Java 8引入了全新的Stream API。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。一、Stream流java抽象出了一个Stream流的概念,源码知道Stream抽象出了一个接口,封装了一些常用的流式计算的方法:public interface Stream<T> extends BaseStream<...原创 2018-05-10 14:46:54 · 581 阅读 · 0 评论 -
tair实现分布式锁
基于tair的分布式锁,在阿里内部技术社区已经有很多讨论了,不过基本上都是基于悲观锁的实现,基本特征是互斥或者阻塞。但实际的业务场景中,并不是所有的地方都需要悲观锁,写冲突很少的场景(例如:员工、门店信息修改),使用乐观锁更为合适。 那么如何设计和使用乐观锁呢?在看具体的代码前需要先对乐观锁的原理有个简单的了解。乐观锁 乐观锁特点 version,版本控制,是乐观锁的根基。乐观锁并不是...原创 2018-07-02 14:28:20 · 1516 阅读 · 0 评论 -
java8的default方法
Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。默认方法使得接口有点类似traits,不过要实现的目标不一样。默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。一、default应用场景 利用java8接口的default特性,可以实现通用异常包装器,可以避免写很多重复的逻辑判断代码。二、...原创 2018-07-02 14:16:16 · 488 阅读 · 0 评论 -
Spring AOP+自定义注解实现日志记录
利用spring aop+自定义注解,来实现日志的记录,把日志记录从业务中解放出来,你只需专注于你的业务代码实现,保持业务代码的干净。自定义日志注解,释放你的双手。日志类注解ClassLogger:import java.lang.annotation.*;@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)...原创 2018-07-02 11:38:42 · 760 阅读 · 0 评论 -
Lamaba表达式五——Sorted
原文链接:https://blog.csdn.net/lsgqjh/article/details/63686383 国外对Java8一系列总结的不错, 翻译过来给大家共享 这篇文章将会讲解Java 8 Stream sorted()示例, 我们能够以自然序或着用Comparator 接口定义的排序规则来排序一个流。C...转载 2018-06-04 14:04:25 · 562 阅读 · 0 评论 -
Lamaba表达式四——Optional类
Optional是jdk1.8引入的一个特殊的类,主要用来解决空指针异常(NullPointerException),本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。一、常用方法1.empty() empty方法会创建一个null的Optional,调用get方法的时候会抛出NPE错误。Optional<String>...原创 2018-05-10 19:52:43 · 601 阅读 · 0 评论 -
Lamaba表达式一
由于开发使用的是jdk8,lamaba表达式作为jdk8一项重要的特性。实际团队项目开发中,发现有不少地方使用了lamaba表达式,所以,特地了解了一下。一、什么是Lambda 表达式 Lambda 表达式简单的说就是匿名函数,即它是没有申明的方法,...原创 2018-05-10 11:09:28 · 943 阅读 · 0 评论 -
Lamaba表达式三
jdk8中针对接口新增了默认方法default以及静态方法static的实现。 Collection 接口中增加了新的 stream 方法,如何能让 MyCustomList 类在不知道该方法的情况下通过编译? Java 8 通过如下方法解决该问题: Collection 接口告诉它所有的子类:“如果你没有实现 stream 方法,就使用我的吧。”接口中这样的方法叫作默认方法,在任何接口中,...原创 2018-05-10 15:26:38 · 1060 阅读 · 0 评论