
Java
文章平均质量分 80
Java语言
咦940
这个作者很懒,什么都没留下…
展开
-
2024最新面试经验分享
叫什么,毕业于哪个学校,多少年经验,目前就职于哪家公司,公司主要是做啥的,你在公司主要是做啥的,项目特点(web项目?分布式项目?大数据实时分析项目),业余写博客?刷leetcode?写开源项目?原创 2024-01-11 16:23:29 · 2208 阅读 · 0 评论 -
经典系统设计题:如何实现短链接
飞书面试的原题,因为没有事先准备过,所以答得不好,一搜才发现是个高频场景题。原创 2024-01-11 15:52:15 · 568 阅读 · 0 评论 -
Java程序内存占用优化实践
在我的项目里,所有Java进程的Thread总共占了八百多MB的内存,有点哈人,所以优化方向已经很明确了,那就是减少线程数量。到了私有化部署,有的客户连个技术人员都没有,只想一键启动就能用,于是将所有服务放在一台物理机上制作母盘,实施安装时省时省力,还能清公司的服务器库存。为了搞清楚原因,我使用NMT追踪Java进程内存使用情况,NMT全称Native Memory Tracking,是HotSpot虚拟机的功能,可跟踪HotSpot虚拟机的内部内存使用情况。大家都说是内存泄漏了,我不信!原创 2023-04-11 15:35:37 · 3244 阅读 · 0 评论 -
十进制转十六进制,Java代码示例与转换思路
接下来一直重复上面的步骤,直到取完了所有比特位,我们已经知道了后面取到的都是0,所以158用十六进制表示就是0000009e,十六进制一般会在前面加上0x作为标识,于是变成0x0000009e,通常我们都会省略高位的0,简写成0x9e,甚至有时候连0x也不要,直接变成9e。如何将它转换成十六进制的形式?十六进制用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)表示,其中A ~ F对应十进制的10 ~ 15。二进制数字占一个比特位,十六进制数字占四个比特位。原创 2023-03-04 23:24:13 · 821 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)是什么?
AQS全称AbstractQueuedSynchronizer,位于java.util.concurrent.locks包下,它是一个用来构建锁和同步器的框架,使用AQS能简单且高效的构造出应用广泛的大量同步器,像ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch等等都是基于AQS的,我们自己也能利用AQS非常轻松的构造出符合自己需求的同步器。原创 2023-02-03 13:57:41 · 668 阅读 · 0 评论 -
通过堆转储快照定位JVM堆内存OOM的问题
通过堆转储快照定位JVM堆内存OOM的问题。获取堆转储快照,dump文件,Eclipse Memory Analyzer的使用方法。原创 2023-02-01 14:53:38 · 611 阅读 · 0 评论 -
JVM自动内存管理核心知识速览
JVM自动内存管理核心知识速览,包括内存空间的划分、对象的内存布局、垃圾收集等知识点。原创 2023-02-01 10:53:27 · 1280 阅读 · 0 评论 -
一文搞懂JDK8 HashMap源码
HashMap的源码非常经典,里面用到了哈希表、链表、红黑树等数据结构,而且又是用纯Java实现的,所以成为了Java程序员必读的源码之一。。废话少说,直接看代码,我这里只摘录重点部分。原创 2023-01-30 14:35:02 · 416 阅读 · 0 评论 -
RandomAccessFile读性能优化
公司的日志采集器是我自己开发的,没用开源产品。日志采集虽然是个小功能,但是要想写好也没那么容易。对于一个日志采集器来说,它应该稳定、可控、占用尽量少的资源。因为日志采集器是和核心业务服务部署在同一台服务器上,如果它工作时CPU和内存占用率飙升、重度磁盘I/O,显然是不合适的,毕竟只是一个辅助功能,不能因小失大。在生产环境运行时发现部分服务日志过多,日志采集器的采集速度跟不上,日志上报有较大延迟。在对我自己编写的代码进行优化后,我想看看jdk的代码有没有优化的空间。原创 2022-10-19 10:24:48 · 2149 阅读 · 0 评论 -
Java程序优雅关机
在Java代码中,可以通过Runtime.getRuntime().addShutdownHook()添加进程停止时的钩子来实现优雅关机。addShutdownHook方法的参数是Thread,我们可以指定进程收到停止信号后所要做的事情(Runnable接口的实现类的匿名对象)。有一点要注意,进程在收到SIGTERM这个信号后,其他用户线程都停止了,只有addShutdownHook指定的线程在工作。15代表SIGTERM,表示正常停止进程,进程可以在退出前完成一些收尾工作;, 实在退出不了再用。...原创 2022-08-10 14:08:03 · 961 阅读 · 0 评论 -
SpringBoot2.7.0集成Redisson操作Redis脚本
SpringBoot、Redisson、Redis、Lua、eval、evalsha、script原创 2022-07-15 18:14:28 · 1812 阅读 · 0 评论 -
Java程序如何实现只启动一个进程?
有时候,我们希望自己的程序在某台服务器上只启动一个进程,启动多个进程可能会引起一些问题。web项目可以通过端口冲突来实现,非web项目可以通过文件排他锁实现。原创 2022-07-15 10:44:04 · 910 阅读 · 0 评论 -
Windows系统排查Java代码CPU占用过高的问题
为了演示,先写个死循环代码:public static void main(String[] args) { while (true) { }}第一步:定位进程跑起来之后打开Windows任务管理器,点击 “查看” -> “选择列” ->勾选"PID",这样“进程”界面就可以显示PID了。如图,CPU占用排第一的java进程PID为9616.第二步:定位线程用Windows自带的pslist -dmx pid命令查看进程的线程信息,结合我们在第一步查询到的PID:p原创 2021-05-25 19:58:45 · 4700 阅读 · 5 评论 -
Java LinkedList详解
简介LinkedList是List接口的实现类,这意味着它可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,可以被当成双端队列来使用,因此既可以被当成“栈”来使用,也可以当成队列使用。LinkedList不是线程安全的,如果想使用线程安全的LinkedList,可以通过如下方式实现:List list = Collections.synchronizedList(new LinkedList());内部结构LinkedList的内部结构是一个双向链表。如下原创 2021-01-24 23:41:28 · 1833 阅读 · 1 评论 -
Java ArrayList详解
简介ArrayList是List接口的典型实现,它是基于数组的,里面封装了一个动态的、允许再分配的Object[]数组。学过数据结构的应该都知道线性表的顺序存储结构,ArrayList就是线性表的顺序存储结构,所以它存、取和求表长的时间复杂度为O(1);插入和删除元素的时间复杂度为O(n).好多初学者没有搞明白存和插入的区别,这里稍作解释。存是指往某个位置放一个元素,不涉及其他位置元素的移动。以排队为例,队伍中第三个位置已经给你预留好了(包括空间),你直接走过去站在那就行,不管那里有没有人,有人你就替换原创 2021-01-20 23:42:32 · 6097 阅读 · 6 评论 -
Java获取网卡(MAC)地址
private String getMACAddress() throws UnknownHostException, SocketException { InetAddress ia = InetAddress.getLocalHost(); byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress(); StringBuilder sb = new StringBuilder(); for (int i =原创 2020-11-27 18:48:17 · 1449 阅读 · 0 评论 -
Java基础回顾之ThreadLocal
ThreadLocal是Thread Local Variable(线程局部变量)的意思。ThreadLocal的功能其实非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。它有如下三个比较常用的方法:T get():返回当前线程局部变量中的值;void remove():移除当前线程局部变量中的值;void set(T value):设置当前线程局部变量中的值.由于ThreadLocal对象的set()方法设置的值只对当原创 2020-10-18 00:00:14 · 122 阅读 · 0 评论 -
自定义一个SpringBoot Starter项目
前言我们在用SpringBoot的时候,只需要依赖一个start项目,无需配置,就能使用这个starter项目的Bean。使用过早期Spring的人都知道,我们要想使用一个Spring bean,必须在xml配置文件里定义这个Bean。后来有了注解,只需在类上加注解,然后配置Spring扫描包的范围,就能够创建这些Bean。那么SpringBoot是如何做到自动创建starter依赖里的Bean的呢?下面来一探究竟。创建starer项目新建一个普通的maven项目,注意,不是springboot项目。原创 2020-05-25 20:51:41 · 329 阅读 · 0 评论 -
Java线程池原理和使用总结
Java线程池总结为什么需要线程池实现一个简单的线程池为什么需要线程池减低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗;提升响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行;提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指...原创 2020-04-19 17:36:11 · 332 阅读 · 0 评论 -
在SpringBoot 2.x中使用RabbitMQ的死信队列和延迟队列功能
在SpringBoot 2.x中使用RabbitMQ的死信队列、延迟队列功能前言延迟队列的基本原理配置测试前言如果你还不知道什么是死信队列、什么是延迟队列、死信队列和延迟队列有什么关系,请参考我的这篇文章:RabbitMQ学习笔记之进阶篇.如果你还不知道怎么在SpringBoot 2.x使用RabbitMQ,请参考我的这篇文章:在SpringBoot中使用RabbitMQ客户端详解.延迟队...原创 2020-03-02 00:18:43 · 634 阅读 · 0 评论 -
Java中的Lock和ReadWriteLock原理浅析
Java中的Lock和ReadWriteLock接口前言锁的可重入性Lock接口ReadWriteLock思路以及简单实现读/写锁的重入前言Java除了提供synchronized关键字来实现线程同步,还提供了一些锁相关的类来实现线程同步。Lock和ReadWriteLock就是两个锁的根接口,使用Lock来实现线程同步,比使用synchronized关键字更加灵活,程序员们有更多的可操作空间...原创 2020-03-01 17:25:18 · 668 阅读 · 0 评论 -
在SpringBoot中使用RabbitMQ客户端详解
在SpringBoot中使用RabbitMQ的各种姿势详解添加依赖编写配置该实例使用的SpringBoot版本是2.2.2添加依赖引入amqp的依赖就行,AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。RabbitMQ就是对该协议的一种实现。<depen...原创 2020-01-14 15:50:43 · 944 阅读 · 0 评论 -
Java多线程基础知识总结
Java多线程基础知识总结线程的状态创建线程的方式线程安全问题线程同步synchronized关键字Lock接口死锁常用方法详解startsleep线程的状态新生:new出来的线程处于新生状态就绪:线程调用start方法后处于就绪状态,等待被CPU执行运行:线程被CPU执行死亡:run方法运行结束后线程会进入死亡状态阻塞:sleep、wait方法的调用,以及IO操作都会让线程阻塞创建...原创 2020-01-18 23:56:14 · 870 阅读 · 0 评论