
java相关
文章平均质量分 69
汇总java,jvm,IDE以及java相关框架使用总结文档
想下班的猿
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
springboot项目中使用docker
docker容器化部署是现在后端集群服务部署的主流方式,我们项目也是基于这种方式,通过swarm管理平台进行集群管理,当需要发布项目时从docker镜像仓库拉取需要发布的镜像,然后让镜像在集群的某一台机器生成容器完成发布。这就需要我们开发将自己的项目在开发完成后把项目打包成docker镜像上传到docker镜像仓库中。我们这里分别介绍一下java springboot项目在maven结构和gradle结构下,如何docker插件完成docker镜像的生成和往docker仓库推送镜像的工作。原创 2022-11-13 15:29:06 · 2739 阅读 · 1 评论 -
mongo游标使用
当我们需要读大量数据库数据进行操作时,游标经常是我们的选择之一,其原理是,首次读取数据时只会将所有项数据的index返回回来,然后再分批次读取完整的数据,这样可以避免一次性大量数据读取到服务器中,占用大量内存。同样能够避免大量数据一次性读进内存的方式还有分页查询,但是分页查询存在深翻页问题,会导致越查越慢。另一种游标式翻页(每次记录上一次查询的最后一条,并作为下一次查询的条件之一),这种唯一的缺点就是每次都需要重新做一次查询,但这个损耗也可以基本忽略,但是有一个问题就是,往往这样的条件不好找。原创 2021-10-21 18:26:44 · 692 阅读 · 0 评论 -
spring-data-mongo的坑之id查询
背景 这是一次生产事故,会后定位到原因是因为spring-data-mongo的id查询导致的,所以将完整的过程都记录一下。我们生产环境有一个mongo表,数据近两千万条,考虑到数据的持续增加,打算进行数据迁移。由于没有现成的索引能进行有效的数据迁移,并且因为表太大也不适合进行建索引,最终的解决方案就是换表。所以这就是一个线上不停机迁表方案,由于该表的读写相对简单,所以采取一次性迁移,流程如下:新数据写进新表数据读取时,先查新表,配置中心增加迁移完成的配置开关,如果开关打开表示迁移没有全部完成原创 2021-07-29 14:37:35 · 948 阅读 · 0 评论 -
线程——AQS详解
AQS(全称:AbstractQueuedSynchronizer),要探究AQS的原因是,几个常见的同步工具都是基于它实现的(栅栏:CountDownLatch,可重入锁:ReentrantLock,可重入读写锁:ReentrantReadWriteLock)。 AQS本身提供了一个等待队列CLH和一个资源变量(state),通过对资源变量的获取修改释放等操作实现各种同步功能,当多个线程尝试获取资源变量时,如果无法获取到,就会进入等待队列,AQS本身实现了队列和资源变量的维护,包括线程进入队列以及原创 2020-05-12 16:47:08 · 717 阅读 · 0 评论 -
多线程系列——并发之CAS
我们通常将多个操作变成一个原子操作的方式有:(1) synchronized (2)lock(3)CAS。这里主要来讲一下CAS这种机制,简单的说,CAS是一种轻量级锁,巧妙的使用比起一味的使用synchronized的性能好很多。 我们先来说一下什么CAS,用一个例子形象的说明。我们在写程序的时候经常用到i++这样的操作,我们表面看是一行指令,其实到了底层并不是一个原子操作,会...原创 2020-05-08 17:13:42 · 176 阅读 · 0 评论 -
多线程系列——线程间通讯
线程间通讯分为两部分:(1)逻辑传递。(2)、数据传递。什么是逻辑传递,比如A是买东西的,B是卖东西的,A到B这里买东西,发现东西还没做好,A就需要等B了,然后B做好东西告诉A,A在买完东西,往下继续做别的事情。AB相当于两个线程,A线程工作到某一点,需要依赖于B做好另一件事情才能继续往下做,这时就要等待,然后B做完另一件事情后来告诉A,A在继续往下做。面对这种等待和通知的场景,java提...原创 2020-05-08 16:31:37 · 152 阅读 · 0 评论 -
多线程系列——多线程基本理解
我们提到多线程都会想到一个优点和和一个缺点:优点是CPU使用率提高了换句话说也就是速度正常情况下会变快(为什么说正常情况下?因为因为CPU使用率过高的情况下,你线程再多也没有用,甚至会降低),缺点就是线程不安全(线程不安全指一个变量在多个线程中进行读写,造成读写的内容不一致,无法判断当前读写的变量值是否为准确的)。 那使用多线程一定会提高效率嘛,线程不安全的根本原因是什么呢,我们...原创 2020-01-01 21:02:27 · 131 阅读 · 0 评论 -
多线程系列——线程封闭
什么是线程封闭?我们来了解一下java内存中的线程模型,java内存中分为共享区域和线程独占区域(当然还有其他的),而所谓线程封闭,即为那些在线程独占区中的内存,在其他线程中是无法获取到这部分内存的,这就叫线程封闭。线程封闭在实际的开发中有很大的作用,因为一旦是线程独占了,我们就不用考虑线程安全的问题,在java中我们如何实现线程封闭呢?ThreadLocal:public cla...原创 2020-01-01 20:52:44 · 194 阅读 · 0 评论 -
多线程系列——优雅关闭线程
多线程有三种关闭方式:1、通过while(flag){}的flag来判断(感觉像是废话)。2、通过stop来关闭。3、线程中所有逻辑执行完,自然结束(感觉也像是废话)。通过while循环的开关来关闭以及线程自然结束大家都知道,我们这里说一下stop。 大家都知道现在的jdk版本中stop方法已经不建议使用了还有什么必要说呢,同时大家也可能会问interrupt难道不能关闭线程嘛,我...原创 2020-01-01 20:48:36 · 903 阅读 · 0 评论 -
多线程系列——线程状态
线程状态 一个java线程拥有以下生命状态:NEW,当线程刚被创建时,其状态就是NEW。RUNNABLE,当线程start()之后则为RUNNABLE状态,RUNNABLE状态包括两种情况,一种是线程可以被CPU调用,处在等待CPU调用时,第二种是线程已经被CPU调用,正在执行时,所以Runable是一个组合状态。BLOCKED,阻塞状态,比如多个线程运行到同步代码块,一...原创 2020-01-01 20:38:45 · 251 阅读 · 0 评论 -
jvm——类加载机制
类生命周期:Created with Raphaël 2.2.0开始1、读取二进制内容2、验证文件格式规范、语义分析、引用验证、字节码验证3、分配内存、变量初始化,比如int设置为0,引用设置为null,布尔类型设置为false4、解析类、接口、字段、方法5、执行静态代码块,为静态变量赋值。6、创建对象,开始使用7、卸载结束其中1到5这几个步骤属于类加载,而其中能够干预的只有第一步,其他四步都...原创 2020-01-31 11:07:17 · 198 阅读 · 0 评论 -
jvm——模型
1、 总体结构 JVM内存模型,又称为JVM运行时数据区,总体结构如下图:1.1 共享数据区 一个jvm进程中一般会存在多个线程,而共享数据区就是指所有线程都可以访问到的内存空间,图中灰色部分几位共享数据区。1.1.1 堆 我们上学的时候老师说过java内存中分为堆和栈,而老师口中的堆,其实就是这里的堆,java虚拟机规范上描述中说,所有的对象实例包括数组的内存都要在...原创 2020-01-18 20:18:33 · 257 阅读 · 0 评论 -
jvm——垃圾收集器
前一章讲的标记清除,标记整理,复制这些都是算法层面的,而真正进行垃圾回收的都是各种垃圾收集器,他们是对各种垃圾回收算法的具体实现。垃圾收集器按大类可分为串行垃圾收集器和并行垃圾收集器,串行有:Serial和Serial Old。并行有:ParNew、Parallel Scavenge、Parallel Old、CMS,G1。下面我们从发展流程和各自利弊来介绍一下每一种收集器。Serial...原创 2020-01-15 17:26:17 · 306 阅读 · 0 评论 -
java服务端操作cookie
cookie是什么 cookie是网络通讯过程中缓存在客户端的浏览器上的一部分内容,由于浏览器访问服务端都是通过http等无状态协议,所以cookie的存在,可以让客户端对一些内容进行留存。java服务端获取cookieCookie[] cookies = request.getCookies(); cookie有:cookie.getName()和cookie.getVal...原创 2020-01-01 19:41:28 · 1570 阅读 · 0 评论 -
spring——基于mongolist元素实现固定大小队列
最近手上有一个需求,需要记录任意两人的会话,并且需要记录最近N条聊天记录。我们首先可以想到一个表记录所有人的聊天记录:发送方,接收方,发送内容,时间。然后一个表记录会话,用户1,用户2,最新的会话时间。然后根据会话表查询聊天记录表获取两人之间的按时间倒序的聊天内容。但是如果最近的N条聊天记录要同会话列表有一同展示就有点头秃了。如果查到一个会话列表,然后遍历去查每个会话的前N条聊天记录。那假设每查一次200ms(因为聊天记录表是庞大的,就算加上了索引,也在几百毫秒的性能损耗),那如果一个列表50条数据原创 2020-10-14 11:12:33 · 264 阅读 · 0 评论 -
maven——高版本打低版本jar包
今天测试那边来一个诡异的要求,要我们打一个jdk1.6的包,然后我就去装了一个jdk1.6,一打报错,报错信息的意思是,maven3.3.1以后必须要jdk1.7的版本,我一看自己的maven是3.6的,指定不行了。那只能去下maven3.3.1以前的版本了,然后打开maven的官网,在下载界面有这么一段:网官网上指明了高版本maven不支持低版本的jdk,但是提供了另一种方式:Too...原创 2020-04-17 10:16:34 · 2447 阅读 · 0 评论 -
maven——骨架搭建和使用
利用maven的模板功能,我们能自己生成自己想要的项目骨架,这样每次重开项目时都能省去很多配置布置,省去很多时间,这里记录一下如何利用maven构建我们自己的骨架项目并生成。我们在项目的根目录下执行maven命令:archetype:create-from-project,如果是直接在目录下执行要mvn:archetype:create-from-project,如果在IDEA或者E...原创 2020-03-22 15:13:28 · 593 阅读 · 0 评论 -
maven——基本使用
maven的打包流程 单独一个项目打包,安装到本地,发布都很简单,打包执行package,安装到本地执行intsall,发布到远程nexus使用deploy即可。如果遇到多级项目打包\安装\发布则需要一级一级进行,比如A依赖于B项目,B依赖于C项目,你打包A项目的时候,你必须先从C开始打包,你可以选择将C安装到本地,或者发布到远程,然后再把B安装到本地或远程,在打包\安装\发布A项目。利...原创 2020-03-22 15:07:14 · 118 阅读 · 0 评论 -
maven——修改默认JDK版本
Maven项目的默认java JDK版本都是1.5,如果想要修改单个maven项目的版本则是当项目路径下的.settings目录下的配置文件中进行修改。但有时候我们希望修改磨人的配置,这样就不用每次创建新的项目都要去修改了。修改默认的jdk版本的方式则是对项目默认使用的maven项目的配置文件进行修改。在maven的配置文件settings.xml中的profiles节点中添加profil...原创 2020-03-22 14:56:30 · 666 阅读 · 0 评论 -
maven——window下安装与配置
下载安装maven在百度上搜索“maven官网”关键字,然后,可以在首页看到官网,点击进去,如下图所示。(也可以从网盘http://pan.baidu.com/s/1eRxRYhW下载)![百度maven][baidu_maven]进入到官网(网页加载比较慢,耐心等待),加载好网页后,点击右侧的“Download”按钮,进入下载页面。![maven下载][maven_downloa...原创 2020-03-22 14:53:57 · 119 阅读 · 0 评论 -
IDEA——修改CustVMOptions造成无法启动
今天遇到一个问题,一大早过来发现IDEA无法启动了,昨晚还是好好的。于是我把IDEA安装目录下的/bin/idea.bat文件最后一行加上了pause暂停,然后手动执行,报错内容如下:OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.Error opening zip fil原创 2020-09-16 10:25:28 · 778 阅读 · 1 评论 -
IDEA——解决不能搜索任何插件问题
出现原因 IDEA的模块系统加载不出来,是由于IDEA的网络安全机制造成的,类似于windows的防火墙,IDEA误认为你的网络不安全,不给你连接。解决方案一(适用于Idea老版本) settings-》system settings-》updates下面的use secure connection去掉勾注意:重新启动idea!!!解决方案二(适用于Idea较新版本)...原创 2020-06-15 09:20:34 · 285 阅读 · 0 评论 -
IDEA——执行gradle任务输出乱码
通过IDEA执行gradle的任务时,在终端的输出出现中文乱码。解决方法是Help->Edit Custom VM Options,然后再最后一行加上-Dfile.encoding=UTF-8重启IDEA即可解决,一定要重启!!!原创 2020-10-10 16:18:50 · 507 阅读 · 0 评论 -
IDEA——bash乱码问题解决
为了方便像linux上以上使用shell,在idea的终端里引入了git bash,这样就可以在window下使用shell了,但是配置之后却出现一个问题,使用git的过程中老会出现乱码问题。解决方法如下:在git bash命令行中依次输入以下命令:$ git config --global core.quotepath false # 显示 status 编码$ git config --global gui.encoding utf-8 # 图形界面编码$ git conf原创 2020-08-01 13:15:39 · 933 阅读 · 0 评论 -
spring——基于mongo的二维索引实现附近的人
最近我们项目中增加了附近的人功能,如果单从实现上考虑其实没有什么难度,采集用户的经纬度坐标,然后用户调用接口去查询附近的人,根据用户的当前坐标去db里一个一个算距离,如果我们用户数就几十几百个,可能每次调接口的时候去算,也能够接受,但是如果你有几百万甚至上亿用户,用户每次来获取附近的人,你就把所有的人的坐标和当前距离算一遍,再排个序,肯定炸了。经过研究发现,现有的一些app,比如微信,陌陌等都是有附近的人这个功能的,而这种空间距离计算,其实都是基于geohash这个算法。 我们都知道在一位数原创 2020-11-02 20:03:12 · 345 阅读 · 0 评论 -
spring——手动往spring容器中添加对象
有时候,我们希望可以手动动态的往spring容器中添加对象,而不是必须要项目启动时就决定容器中有哪些对象,对于这种情况,spring提供了一种方式,DefaultListableBeanFactory: @Autowired DefaultListableBeanFactory defaultListableBeanFactory; A a = new A...原创 2020-03-30 18:55:37 · 1850 阅读 · 0 评论 -
spring——由JMS到BeanPostProcessor和SmartInitializingSingleton
起因 最近手上项目从activemq切换阿里云的rocketmq,众所周知amq的listener属于JMS架构,spring项目中只需要在方法级别上加一个@Listener(destination=“xxx”)就好了,然后反手在看阿里云官方提供的样例代码,不免陷入了人生和社会的大思考。 为了看得更加明了,这是一段阿里云上给的rocketmq的消费者示例代码:Properties...原创 2019-12-23 17:25:34 · 693 阅读 · 0 评论 -
springboot——多环境配置文件
自己手上有一个项目,想要分环境设置yml配置文件,比如数据库,密钥等,各个环境都配置的不一样。但是又有一些公共的配置,比如一些需要进行配置化的业务常量等。比如当下有开发和生产环境,需要有三个配置文件:application.yml,application-dev.yml,application-prod.yml。其中application.yml为公共配置文件,在其中配置:spring: profiles: active: dev这样开发环境启动的时候,默认加载applicatio原创 2020-10-16 10:40:35 · 180 阅读 · 0 评论 -
springboot——项目maven打包
普通的maven项目直接通过执行maven命令package打包即可,如果springboot项目则需要依赖springboot的打包插件在执行package命令进行打包,但是对于聚合项目来说,直接打包子模块是不行的,可以通过直接package整个聚合项目进行打包,但是如果子模块中存在springboot项目,则这样打包出来的springboot项目无法通过java -jar命令进行启动运...原创 2020-04-02 18:05:54 · 905 阅读 · 1 评论 -
springboot——项目文件上传失败
之前给博客做了一个后台,具备图片上传功能,后台是基于springboot实现的,服务器也是利用的springboot自带的tomcat,一开始做出来的时候还可以,但过了一段时间使用上传功能发现上传失败了,报错如下:2019-09-16 17:27:10.277 [http-nio-8083-exec-2] ERROR org.apache.catalina.core.Container...原创 2019-12-23 18:13:26 · 1082 阅读 · 0 评论 -
IDEA——使用jboss
整理一下,IDEA如何使用jboss容器进行启动服务。首先我们需要下载jboss,需要注意的是jboss7以后改名为wildfly,所以网上搜wildfly时其实就是jboss。我们可以进jboss官网下载不过速度较慢,这里提供一下百度云盘下载链接:url:https://pan.baidu.com/s/1SohN7DbndqB7_9RaHZbDVA验证码:7GI9菜单Fil...原创 2020-05-06 20:00:36 · 3153 阅读 · 0 评论 -
spring——spring-data自定义mongo的聚合指令
最近使用基于spring-data的api对mongo进行操作时发现一些局限,比如如下命令: .match({time:{$gte:ISODate("2020-08-01T00:00:00.000+08:00"),$lt:ISODate("2020-09-01T00:00:00.000+08:00")}}) .unwind("$userList") .group({ _id: "$qd", "regUsers":{$addToSet:原创 2020-08-25 09:25:56 · 425 阅读 · 0 评论 -
spring——事务动态代理造成属性为null
近日遇到一个很诡异的问题,kotlin的一段老代码莫名其妙报空指针,而且只有整个springboot项目起起来才会报错,如果写单元测试时单独注入几个类,是不会报错的。最终锁定原因是因为在原本的service类中,新增的一些方法我加上了@Transcational进行事务处理,这就导致生成service类的对象时会为他生成一个基于cglib创建的代理子类。而这个子类中所有的属性都是空指针:但是为什么创建出来的对象会属性都为空呢,毕竟这这些属性都在父类的构造方法里,继承父类构建的子类也需要重写父类的原创 2020-08-18 20:03:29 · 3052 阅读 · 6 评论 -
spring——事务问题
spring基于代理的事务分为以下几个类别:required,支持当前事务如果没有再创建一个supports:支持当前事务,如果没有,就不使用事务mandatory:强制使用当前事务,如果不存在抛异常requires_new:必须创建一个新的,如果有了挂起not_supported:不支持,如果有事务,把事务挂起never:如果有事务,抛异常nested:嵌套,如果当前有了,执行嵌套,如果当前没有创建一个新的通常情况下我们在一个方法体上加上@Transcational这个注解,就能原创 2020-08-06 23:15:41 · 225 阅读 · 0 评论 -
IDEA——远程调试
jboss服务器远程调试进入jboss/bin目录下 修改standalone.conf,找到#JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"将这一行的注释去掉,其中8787是远程监控的端口号,注意不要使用已经使用过的端口普通java程序在启动命令中加入这么一段:-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspe原创 2020-05-26 09:36:25 · 291 阅读 · 0 评论 -
动态增加枚举值
之前做东西遇到了这么一个需求,希望动态的增加枚举类中的枚举值。我们正常情况下都是先定义枚举类,然后写好静态的枚举值,然后在代码中使用,那可不可以动态的增加枚举呢?研究后通过反射是可以实现的。工具类如下:package com.huifu.uttf.util.utils;import java.lang.reflect.AccessibleObject;import java.lang.reflect.Array;import java.lang.reflect.Field;import原创 2020-05-12 10:17:44 · 3442 阅读 · 5 评论 -
图片压缩指定大小
我们经常会遇到一些关于图片大小的问题,比如我最大只能容忍500KB,你给我传一个600KB的,或者更大的,这个时候就很不舒服了,而且为了服务器存储压力,也建议一般限制上传文件的大小。下面是之前遇到需要压缩文件大小时写的工具类(借鉴了网上的代码,仅此做个分享和后续查阅),代码中有两处被注释的代码,往下的第三行代码是用来替代前两行代码的,为什么要做这个替代呢?因为com.sun.image.codec.jpeg这个包sun公司开发的封闭类,在jdk1.8中被oracle去除掉了,所以当在jdk1.8环境下编译是原创 2020-05-09 10:43:26 · 428 阅读 · 0 评论 -
篡改既存的jar包
这一篇其实是接着《利用动态代理扩展类加载器的功能》这一篇的,因为都是在解决同一个问题。《利用动态代理扩展类加载器的功能》中说道通过动态代理生成ModuleClassLoader的代理对象,并通过 Thread.currentThread().setContextClassLoader(classLoaderProxy)修改调原本的类加载器。但是这样只能修改当前线程的类加载器,如果说代码中是...原创 2020-05-06 15:58:59 · 208 阅读 · 0 评论 -
ConcurrentHashMap实现原理及源码分析
ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现,ConcurrentHashMap在并发编程的场景中使用频率非常之高,本文就来分析下ConcurrentHashMap的实现原理,并对其实现原理进行分析(JDK1.7).ConcurrentHashMap实现原理 众所周知,哈希表是中非常高效,复杂度为O(1)的数据结构,在Java开...转载 2020-04-20 10:15:11 · 219 阅读 · 0 评论 -
jvm——利用动态代理扩展类加载器的功能
最近一个服务里做了一个利用URLClassLoader类加载器动态增加jar包的功能,本地运行的好好地,结果发布到linux发现无法启动。后来找到原因是我们linux上是用的jboss作为服务器,而本地是利用的springboot内置的tomcat,而jboss7以后使用的类加载器是ModuleClassLoader,这个加载器不是继承自URLClassLoader的,所以原本在本地跑的没...原创 2020-04-09 19:46:43 · 324 阅读 · 0 评论