java
文章平均质量分 62
laterxie
喜欢旅行,打羽毛球,打乒乓球,看足球,动漫.对大数据,分布式,消息中间件,高并发感兴趣
展开
-
Java线上常见问题排查方法
CPU问题cpu问题是比较常见的问题,cpu负载过高会导致系统接口卡顿,响应变慢,对于造成cpu过高的大致有以下几种情况。JVM频繁GC导致cpu高。存在死循环,导致cpu负载过高。执行其他消耗cpu多的操作,比如打印过多的debug日志,循环过多。在实际开发中,遇到比较多的是频繁gc,尤其是频繁Full GC导致cpu过高。频繁Full GC主要由以下几种情况。老年代空间不足metaspace方法区空间不足System.gc()针对cpu过高的常用排查方法由:使用arthas原创 2022-04-20 01:40:00 · 1991 阅读 · 0 评论 -
一次Full GC导致CPU飙升的排查过程
一次FULL GC导致CPU飙升,系统卡顿的问题排查过程,JVM, FULL GC原创 2022-04-10 01:01:30 · 2417 阅读 · 0 评论 -
如何解决 if-else 过多的问题
前言 if-else基本上是所有高级语言都有的语句。Java,Python,Go,C++。可以说if-else是编程 语言种必须用的。基本上大大小小的需求都需要用到if-else。if-else不能滥用,不要让自 己变成只会写if-else的程序员。if-else滥用会导致代码可读性,维护成本增高。我们需要 使用好if-else来。使用卫语句,提前return。提前return减少不必要的判断,减少If-else嵌套层次。优化前: if(a != null){原创 2020-07-20 00:55:17 · 6209 阅读 · 1 评论 -
使用FutureTask执行并行耗时任务
在实际开发中,一般任务都有串行和并行之分。比如走完A步骤之后才能在走B步骤,这个属于串行。比如登录注册操作,只有先获取验证码,然后在使用验证码登录。又比如为了获取一个商品的价格,我们可以从多个渠道获取,从不同渠道获取商品价格是属于并行任务的,多个渠道之间完全没有任何的关系。这个时候我们一般都要搜集结果。FutureTask就是非常适合这种情景的。 主要api有get,run,canc...原创 2017-11-06 00:04:07 · 2723 阅读 · 0 评论 -
Spring嵌套事物,事物的传播之REQUIRES_NEW
很久没写博客了,大概是目前这份工作本身就能让我学到挺多东西吧,所以没去写博客了,希望以后的自己,只要工作内容是开发就要保持一个月至少一篇的博客吧。 > 之前写过一篇文章是关于spring事物的传播行为的。 > 今天这篇文章主要是将RROPAGATION_REQUIRES_NEW传播行为在实际项目中的使用。该事物会开启一个新的事物也就是创建一个事物和之前的事物没有任何关系。 关于PROPAG原创 2017-10-23 00:23:07 · 4063 阅读 · 2 评论 -
Java中的ThreadLocal
ThreadLocal其实,它就是一个容器,用于存放线程的局部变量。为每个线程保留一份变量副本。 我们来看下面的代码: 数据库连接工具package com.xfl.concurrent;import java.sql.Connection;import java.sql.DriverManager;/** * Created by XFL * time on 2017/5/16 23:原创 2017-05-17 00:35:46 · 263 阅读 · 0 评论 -
HashMap详解
原文链接:https://zhuanlan.zhihu.com/p/21673805 摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功转载 2017-05-21 22:25:11 · 482 阅读 · 0 评论 -
Java动态代理
在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。 java的动态代理应用非常广泛,比如Spring的aop,在Spring中利用aop可以进行事务管理,而Spring的aop的实现原理就是java的动态代理。分布式服务框架dubbo也是利用了j原创 2017-05-15 23:24:25 · 262 阅读 · 0 评论 -
Java四种线程池的使用
Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 n转载 2017-05-17 23:19:50 · 246 阅读 · 0 评论 -
使用Java实现简易RPC框架
RPC其全程为Remote Process Call,即为远程过程调用。RPC将传统的本地调用转换为调用远端的服务器的方法,给系统的处理能力和吞吐量带来了极大的提升。 随着项目的发展,业务越来越复杂,单个项目的话,会非常复杂,且不易维护,如果单个项目挂了就会导致整个系统都无法使用,但是把复杂的业务拆分为多个小业务就方便系统的维护与开发。这种情况下就会有系统之间的相互调用。当日调用量不大的时候原创 2017-05-14 23:24:17 · 1965 阅读 · 0 评论 -
使用redis 实现分布式锁
使用redis 实现分布式锁在有些需要高可用的场景中,保证并发量的情况下需要使用分布式锁来做控制,保证应用的可靠性。我们知道jdk提供了一些常用的锁比如ReentrantLock,ReentrantReadWriteLock,synchronized。对于这些锁的实现这里就不详细介绍了,在使用过程中这些锁锁的是对象,在单服务器的时候有用。但是现在基本都不是单一服务器了,一般都会有多台服务器。对原创 2018-01-14 23:59:34 · 391 阅读 · 0 评论 -
RedisTemplate系列化器之GenericJackson2JsonRedisSerializer
Redis作为高速缓存数据库,目前应用非常广泛。RedisTemplate是Spring提供用于操作redis数据库的一个类。 将数据存放到Redis中,以及数据读取。这里必然涉及到数据的系列化和反系列化。RedisTemplate默认的系列化类是JdkSerializationRedisSerializer,用JdkSerializationRedisSerializer序列化的话,被序列化的...原创 2018-02-27 01:04:08 · 30187 阅读 · 2 评论 -
Java中CAS详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatil...转载 2018-03-04 22:16:08 · 205 阅读 · 0 评论 -
解决Java中Long类型转换成Json时,在Js代码调用时精度丢失的问题
在Java中18位或者更高位的Long类型转化成json,js调用时会存在精度丢失的问题。Spring MVC中默认的消息转换器时MappingJackson2HttpMessageConverter,使用的是Jackson系列化的,也就是ObjectMapper。所以我们也可以设置ObjectMapper将所有的Long类型转换成String类型,但是这个方法粒度大,会将所有的Long类型都转换...原创 2018-03-20 23:37:25 · 2910 阅读 · 0 评论 -
使用Spring的Aop拦截请求参数,请求头信息,响应结果,响应时间
在Web应用中线上请求的监控非常重要,在大部分的应用中对于请求参数返回参数,响应时间,请求头信息都是非常重要的,对于线上问题排查是非常重要的。这里使用Spring aop来实现对每个请求监控,打印请求参数,返回参数等等。在实际应用中随着线上应用的稳定需要对uri做监控管理,哪些需要监控,哪些不需要等等设置,如果稳定的请求监控会消耗大量的性能。最好能够对每个请求实体返回实体实现系列化接口,重...原创 2018-05-29 01:03:01 · 24758 阅读 · 4 评论 -
springboot使用hibernate-validator校验请求参数
作为Web后台开发人员,对于api接口进行参数校验是非常必要的操作。可以说不进行参数校验是不负责任的开发。对参数校验才能使接口更加安全健壮。每个业务接口都有大量的参数需要校验。如果将这些参数放置到业务中使用if,else之类的判断则会显得代码不简洁。多了很多不必要的参数校验代码。验证代码繁琐,重复劳动。 在开发中使用hibernate-validator框架进行参数校验能非常友好的解决代码繁琐,...原创 2018-08-13 00:33:00 · 3130 阅读 · 1 评论 -
Java单例的实现,单例模式为什么需要volidate
单例模式可以说是大多数开发人员在实际中使用最多的,常见的Spring默认创建的bean就是单例模式的。单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。其中单例模式最重要的是确保对象只有一个。 常见单例模式的实现方式。主要是区分懒加载,非懒加载。 非懒加载实现方式: 该方式使用的是类加载机制确保系统只会生成一个对象。但是该方式没有实现懒加载。public class TestS...原创 2018-08-28 00:27:58 · 3708 阅读 · 1 评论 -
Java字符串相似度匹配
原文:http://wdhdmx.iteye.com/blog/1343856#bc2319361package com.xfl.boot.common.utils;/** * Created by XFL * time on 2018/11/16 0:10 * description: */public class SimilarityUtils { public sta...转载 2018-11-16 00:30:31 · 15986 阅读 · 3 评论 -
Spring aop获取目标对象,方法,接口上的注解
在开发中,我们经常需要使用spring aop自定义注解来实现一些特定的功能。比如权限拦截,多数据源动态切换。在编写切面通知实现类中我们需要获取到注解上的值内容。比如方法上的注解,类上的注解,接口上的注解。AOP的基本概念:切面(Aspect) :通知和切入点共同组成了切面,时间、地点和要发生的“故事”。连接点(Joinpoint) :程序能够应用通知的一个“时机”,这些“时机”就是连接...原创 2018-11-25 22:51:54 · 26301 阅读 · 9 评论 -
JedisSentinelPool配置说明
Jedis是Java最常用的用于连接Redis的客户端。也是Redis官方推荐的Redis连接客户端之一。一般在项目中是使用Spring来管理jedis的连接池的,利用Spring ioc容器来管理。 <!--配置Jedis连接池--> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <pr原创 2017-03-21 23:38:07 · 8502 阅读 · 0 评论 -
Spring RestTemplate的使用(解决put,delete方法无返回值问题)
Spring提供了RestTemplate,可以利用RestTemplate调用REST资源。 同时也可以用作服务端到服务端发送请求。 在Java后台开发中,也可以使用RestTemplate来测试接口。 RestTemplate支持get,put,delete,post操作。package com.test;import org.springframework.http.ResponseEn原创 2017-03-11 23:03:42 · 17760 阅读 · 2 评论 -
Java反射
学习Java就不得不提Java的反射。 Java反射是指程序在运行过程中可以动态的获取类的属性与方法。主要是使用类Class来加载需要动态获取的类, Class类没有公有的构造方法,它由JVM自动调用(在new对象或者加载-classLoader时)。Class 类是在Java语言中 定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Clas原创 2016-09-25 22:00:22 · 181 阅读 · 0 评论 -
Spring <context:component-scan/>与<mvc:annotation-driven/>
<mvc:annotation-driven/>开启SpringMVC注解支持,相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。如果没有开启此注解则会显示404找不到页面,就是没有配置视图解析的原因。<con原创 2016-10-09 23:09:35 · 661 阅读 · 0 评论 -
使用Filter为请求方法添加跨域支持
跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求。这里有域名的不同,端口号的不同。 很多浏览器在发起跨域访问时是会询问用户是否需要发送该请求,或者干脆不发送跨域访问请求。(最好的办法是不使用ajax之类的,不要在前端发起跨域请求,在后台服务器发送该请求,可以使用Spring的RestTemplate)原创 2016-09-18 17:26:43 · 3475 阅读 · 0 评论 -
java文件的上传与下载原理(使用Servlet)
在TCP/IP中最早出现文件上传机制的是FTP。它是将文件由客户端发送到服务器的标准机制。但是在JSP编程中不能使用FTP方法上传文件,这是由于jsp运行机制所决定的。 文件的上传:通过为表单元素设置Method=”post” enctype=”multipart/form-data”,让表单提交的数据以二进制编码的方式提交。在接收此请求的Servlet中用二进制流来获取内容,就可以原创 2016-08-18 23:13:05 · 1661 阅读 · 0 评论 -
java序列化与反序列化
java序列化是什么,是怎么实现的,为什么要序列化? 我们知道,无论是保存文本,图片还是视频等资源到硬盘上时,是无法直接将字符串,图片保存到硬盘上的,我们只能将这些资源转化为字节之后才可以保存到硬盘上,也就是数据的持久化。同理从硬盘中读取的数据也是字节,需要将字节转化为我们需要的格式。(字符流读取字符串时,也是在内部将字节转化为字符,字符流只能够读取字符,而字节流几乎可以读取所有资源)原创 2016-08-07 19:40:51 · 263 阅读 · 2 评论 -
Java泛型中E、T、K、V等的含义
Java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素)T - Type(Java 类) K - Key(键)V - Value(值) N - Number(数值类型)? - 表示不确定的java类型 S、U、V - 2nd、3rd、4th types转载 2016-08-07 17:11:13 · 259 阅读 · 0 评论 -
java IO的字节流和字符流及其区别
java IO的字节流和字符流及其区别字节流和字符流的概念 1.1 字节流继承于InputStream OutputStream, 1.2 字符流继承于InputStreamReader OutputStreamWriter。 在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。字节流与字符流的区别 2.1 要把一片二进制数据数据逐一输出到某个设备中,或者从某转载 2016-08-02 23:01:53 · 845 阅读 · 1 评论 -
java虚拟机HotSpot
1. HotSpot历史 SUN的JDK版本从1.3.1开始运用HotSpot虚拟机, 2006年底开源,主要使用C++实现,JNI接口部分用C实现。 HotSpot是较新的Java虚拟机,用来代替JIT(Just in Time),可以大大提高Java运行的性能。 Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢。而HotSpot将常用的部分代转载 2016-08-01 23:32:12 · 385 阅读 · 0 评论 -
Java中使用Jedis操作Redis
package com.test;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.junit.Before;import org.junit.Test;import redis.clients.jedis.Jedis;public转载 2016-09-27 23:07:53 · 348 阅读 · 0 评论 -
Spring常用注解
Spring发展非常迅速,在JavaWeb开发中使用SpringMVC或者SpringBoot的开发者越来越多。这大概是因为Spring能够整合绝大多数 的开源框架,比如Mybatis,Redis,Hibernate,Structs,quartz等等。 Spring中有非常多的注解,使用这些注解可是减少大量的代码,同时最方便的初始化开发者需要的对象,更好的管理bean的生命周期。注解最重要的作用就原创 2016-09-27 23:38:31 · 251 阅读 · 0 评论 -
Java浮点数计算精确度问题
在Java中如果使用浮点型小数进行计算,尤其是商业计算将会出现奇怪的结果。比如下面的程序:System.out.println(30.29 - 1.01);我们期望它输出的结果是29.28,但是实际结果确是:29.279999999999998。 首先解释下为什么,为什么整数的时候不会呢,只有浮点数float,double才会呢,而且有的时候会,有的时候不会? 比如下面的程序:System.ou原创 2017-02-26 18:02:57 · 524 阅读 · 0 评论 -
Java中static变量作用和用法详解
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何转载 2017-02-12 12:06:37 · 313 阅读 · 0 评论 -
Java中的try catch finally
一直以为自己对try catch足够了解了,但是在看到这篇博客后才意识到自己了解的仅仅是皮毛。 首先要知道f inally不是一定会执行的.下面的情况下finally就肯定不会执行的。 (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行, 这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。原创 2016-12-03 22:14:53 · 613 阅读 · 0 评论 -
Java中的Final关键字,区分基本数据类型与引用类型,值传递与引用传递
Final可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了。对于基本数据类型声明为Final后其值无法再次改变,对于引用类型,可以改变改引用的内容,但是无法改变这个引用,即不能再次指向新的引用地址,也就是重新赋值,new一个新的对象。首先我们来看看基本数据类型与引用类型的区别: 如上如所述; 对于基本类型,变量中保存的是其值。对于引用类型,变量中保存的原创 2016-10-20 23:50:55 · 2982 阅读 · 2 评论 -
quartz集群分布式(并发)部署所需要的11张数据表
1.持久化任务:当应用程序停止运行时,所有调度信息不被丢失,当你重新启动时,调度信息还存在,这就是持久化任务(保存到数据库表中)。2.集群和分布式处理:当在集群环境下,当有配置Quartz的多个客户端时(节点),采用Quartz的集群和分布式处理时,我们要了解几点好处1) 一个节点无法完成的任务,会被集群中拥有相同的任务的节点取代执行。2) Quartz调度是通过触发器的类别来识别不同的任务,在不同原创 2016-10-07 10:23:58 · 1626 阅读 · 0 评论 -
Spring事物管理
事物管理对于企业应用是非常重要的,它能够保证每个操作都是靠得住的,要保证后台数据库的数据是完整的。比如程序需要分别向两张表中插入数据,第一条sql执行成功,但是第二条sql执行失败。这时候就需要将第一条sql回滚了,确保数据的完整性。事物主要包括四个特性: 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。 一致性(Cons原创 2016-10-16 11:45:17 · 239 阅读 · 0 评论 -
HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么。当你在面试中被问到这个问题,你的内心充满了自信和喜悦。 你轻轻松松的给出了一个“标准答案”:GE转载 2016-10-25 23:09:01 · 189 阅读 · 0 评论 -
logback 的配置和使用
Logback是由log4j创始人设计的又一个开源日志组件。经常用来打印日志。 本文介绍是Spring集成logback。同时介绍一些常用的logback配置文件说明。 需要的jar包。这里使用的是maven配置 <!--logback相关架包--> <dependency> <groupId>org.logback-extensions</group原创 2016-10-13 22:48:28 · 3042 阅读 · 0 评论 -
Java内存区域
Java内存区域,程序计数器,虚拟机栈,本地方法栈,堆区,方法区,直接内存转载 2016-08-01 23:23:22 · 160 阅读 · 0 评论