Java
Java基础
commonBean
这个作者很懒,什么都没留下…
展开
-
HashMap的hash方法简述
来源:蔚来一面:HashMap 的 hash 方法原理是什么?看完这篇还不懂HashMap的hash原理,那我要哭了~ static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }将它右移16位h >>> 16的原因:hashCode是int32位,右移16位,即取高位。转载 2021-09-23 10:21:46 · 420 阅读 · 0 评论 -
LockSupport.park和unpark,wait和notify
LockSupport.park方法使当前线程阻塞,unpark可以恢复其运行。LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次调用park会变成block(因为permit为0了,会阻塞在这里,直到permit变为1), 这时调用unpark会把permit置为1。每个线程都有一个相关的permit, permit最多只有转载 2021-09-22 15:50:08 · 360 阅读 · 0 评论 -
ThreadLocal.ThreadLocalMap分析
参考文章:ThreadLocal源码分析_02 内核(ThreadLocalMap)循环获取下标,形成一个环。getEntry方法:先根据key计算出索引下标,获取到entry。如果没有获取到对应的entry,调用getEntryAfterMiss继续获取没有获取到对应的entry,可能有2种情况:1,不存在该线程对应的value;2,hash冲突,该entry被放到了后面(解决hash冲突不是在该slot上使用链表,而是放到后续的slot中)getEntryAfterMiss方法:原创 2021-09-17 17:36:35 · 157 阅读 · 0 评论 -
CopyOnWriteArrayList的使用场景
1.适用于数据量不大的场景,不适用于数据量大的场景。由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致young gc或者full gc2.适用于读多写少的场景,不适用于实时读的场景。CopyOnWriteArrayList能保证写操作的线程安全,也能保证数据的最终一致性,但是无法保证数据的实时一致性。CopyOnWriteArrayList在写操作中,使用了ReentrantLock锁以保证线程安全,并替换原array属性;但是读的时候直接读取array,可能会发生原创 2021-06-27 12:08:27 · 2452 阅读 · 0 评论 -
线程池的几个常识
线程并没有区分是核心还是非核心,并不是先创建的就是核心,超过核心线程数后创建的就是非核心,最终保留哪些线程,完全随机。allowCoreThreadTimeout可以设置核心线程为可回收,但不建议这么做。何时回收非核心线程?看getTask()方法:当当前线程数大于核心线程数,且工作队列为空时,在getTask()方法中调用compareAndDecrementWorkerCount方法,将线程数减一。getTask方法返回null后,runWorker方法内部的while循环结束,执行proces原创 2021-05-21 11:03:27 · 82 阅读 · 0 评论 -
java8 map reduce
reduce的用法java8 map reduceOptional<T> reduce(BinaryOperator<T> accumulator);里面的accumulator是BinaryOperator类型,该类的父类是BiFunction。也就是说,该方法是要有返回值的。// 求和stream.reduce((a, b) -> a + b);Optional<T> reduce(U identity, BinaryFuncti转载 2021-04-08 17:07:13 · 228 阅读 · 0 评论 -
java8 日期时间类
Instant:瞬时实例。LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。LocalTime:本地时间,不包含日期。LocalDateTime:组合了日期和时间,但不包含时差和时区信息。ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。解析、格式化时间的 DateTimeFormatter 类也全部重新设计。常.转载 2020-10-23 13:33:49 · 152 阅读 · 0 评论 -
java问题排查工具
【转载】我的java问题排查工具单jmap看看堆都被谁占了? 再配合zprofiler和btrace,排查问题简直是如虎添翼它可以生成 java 程序的 dump 文件, 也可以查看堆内存使用、分配信息# 查看堆的情况jmap -heap 1# dumpjmap -dump:live,format=b,file=/tmp/heap2.bin 1jmap -dump:format=b,file=/tmp/heap3.bin 1# 查看堆的占用jmap -histo 1| head转载 2020-10-29 16:57:32 · 142 阅读 · 0 评论 -
Tomcat类加载机制
引言Tomcat 在部署 Web 应用的时候,是将应用放在 webapps 文件夹目录下,而 webapps 对应到 Tomcat 中是容器 Host ,里面的文件夹则是对应到 Context ,在 Tomcat 启动以后, webapps 中的所有的 Web 应用都可以提供服务。这里会涉及到一个问题, webapps 下面不止会有一个应用,比如有 APP1 和 APP2 两个应用,它们分别有自己独立的依赖 jar 包,这些 jar 包会位于 APP 的 WEB-INFO/lib 这个目录下,这些 j.转载 2020-10-09 22:45:08 · 343 阅读 · 0 评论 -
JDK常用监控指令和监控工具分析及OutOfMemory异常分析
【JVM系列6】JDK常用监控指令和监控工具分析及OutOfMemory异常分析 刀哥谈Java 2020年09月21日 阅读 434 关注 【JVM系列6】JDK常用监控指令和监控工具分析及OutOfMemory异常分析 前言JVM系列前5篇文章相对偏向于理论,从这篇开始将会结合实际场景进行分析以及如何对JVM进行调优。JVM参数所谓的JVM调优说白了就是去设置一个合理转载 2020-09-21 19:54:43 · 267 阅读 · 0 评论 -
从一个Java对象看JVM内存模型及对象生命周期
【JVM系列4】new Object()到底占用几个字节,看完这篇就彻底明白了package com.zwx.jvm;public class HeapMemory { private Object obj1 = new Object(); public static void main(String[] args) { Object obj2 = new Object(); }}上面的代码中,obj1 和obj2在内存中有什么区别?答: 这个obj原创 2020-09-21 19:13:50 · 266 阅读 · 0 评论 -
JVM内存模型简述
运行时数据区:Run-Time Data Areas。主要包括如下部分:pc寄存器,堆,方法区,虚拟机栈,本地方法栈。PC(program counter) Register(程序计数器)每个线程独占的空间。为了切换线程之后能回到原先执行的位置,每个JVM线程都必须要有自己的pc(程序计数器)寄存器来独立存储执行信息,这样才能继续之前的位置往后运行。Heap(堆)堆是Java虚拟机所管理内存中最大的一块,在虚拟机启动时创建,被所有线程共享。堆可以处于物理上不连续的内存空间,可以固定大小,也可以.原创 2020-09-21 16:22:14 · 136 阅读 · 0 评论 -
JVM理论
5个问题重新认识新生代YGC 在新生代中进行,首先要清楚新生代的堆结构划分。新生代分为Eden区和两个Survivor区,其中Eden:from:to = 8:1:1 (比例可以通过参数 –XX:SurvivorRatio 来设定 ),这是最基本的认识。为什么会有新生代?如果不分代,所有对象全部在一个区域,每次GC都需要对全堆进行扫描,存在效率问题。分代后,可分别控制回收频率,并采用不同的回收算法,确保GC性能全局最优。为什么新生代会采用复制算法?新生代的对象朝生夕死,大约90%的新建对象可以被原创 2020-09-20 23:31:39 · 129 阅读 · 0 评论 -
JVM调优实践,FullGC40次/天到10天一次的优化过程
文章链接一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程转载 2020-09-20 23:16:37 · 101 阅读 · 0 评论 -
JVM GC问题排查(多数是内存泄漏导致)
原文地址YGC问题排查,又让我涨姿势了!主要内容:超时量突然大面积增加,1分钟内甚至达到了上千次接口超时。收到告警后,我们第一时间查看了监控系统,立马发现了YoungGC耗时过长的异常。通过下图可以看出:在上线之前,YGC基本几十毫秒内完成,而上线后YGC耗时明显变长,最长甚至达到了3秒多。由于YGC期间程序会Stop The World,而我们上游系统设置的服务超时时间都在几百毫秒,因此推断:是因为YGC耗时过长引发了服务大面积超时。我们立刻摘掉了一个节点,然后通过以下命令dump了堆内存原创 2020-09-20 23:16:50 · 533 阅读 · 0 评论 -
程序线程池大小设置
在设置线程池大小时,我们首先需要了解该程序是IO密集型还是CPU密集型。线程池大小 = ((线程 IO time + 线程 CPU time )/线程 CPU time )* CPU数目这里需要知道的三个要素:一个请求的IO时间 (线程 IO time)该请求计算时间 (线程 CPU time)CPU 数目Mark~~...原创 2020-12-14 16:39:32 · 129 阅读 · 0 评论 -
可重入锁
TODO原创 2020-10-24 17:34:00 · 184 阅读 · 0 评论 -
ThreadPoolExecutor部分方法解读
文章目录状态与位移运算、或与非常量分析:方法分析:execute(Runnable command)分析状态与位移运算、或与非 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3; private static final int CAPACITY = (1 << C原创 2020-10-11 17:13:51 · 162 阅读 · 0 评论 -
java线程池理论知识拾遗
五种线程池的使用场景newSingleThreadExecutor:一个单线程的线程池,可以用于需要保证顺序执行的场景,并且只有一个线程在执行。newFixedThreadPool:一个固定大小的线程池,可以用于已知并发压力的情况下,对线程数做限制。newCachedThreadPool:一个可以无限扩大的线程池,比较适合处理执行时间比较小的任务。newScheduledThreadPool:可以延时启动,定时启动的线程池,适用于需要多个后台线程执行周期任务的场景。newWorkStealingP原创 2020-09-23 11:15:47 · 103 阅读 · 0 评论 -
java SPI简述
引用Java 的 SPI 机制,英文全称是 Service Provider Intrface,常用于框架的可扩展实现。Java 语言的 JDBC、JDNI 就使用了这种技术,甚至我们常用的 dubbo 也是在 Java SPI 机制基础上做的改进。Service Provider Framework 的四个概念:Service Interface 服务接口,(这里对应 Song 接口。)Provider Registration API 用户注册接口,(这里对应 ParserManager.转载 2021-01-16 11:31:01 · 148 阅读 · 0 评论 -
关于ThreadLocal内存泄漏的问题
【引用】https://www.jianshu.com/p/b74597032598对于ThreadLocal,我的理解是:每个线程Thread对象里面有个ThreadLocalMap(可以当成Map看),map对象里面的key就是ThreadLocal对象,value是ThreadLocal#set进去的Object对象。如果在逻辑执行完成后,key-value键值对没有从map对象中移除,map就会一直持有该键值对,对于线程池中的线程对象来说,这种键值对越积越多,无法释放,就造成了内存泄漏,最终导原创 2020-12-14 15:56:40 · 67 阅读 · 0 评论 -
SimpleDateFormat与DateTimeFormatter的线程安全性
SimpleDateFormat代码分析 /** * The {@link Calendar} instance used for calculating the date-time fields * and the instant of time. This field is used for both formatting and * parsing. * * <p>Subclasses should initialize this原创 2020-11-24 13:12:10 · 1835 阅读 · 0 评论 -
ArrayList与LinkedList的性能差别
size:集合元素个数,elementData.length:数组长度ArrayList初始容量为0,一旦加入元素后,容量至少变为10;继续增加元素,当size=elementData.length时,容量增加到原来的1.5倍(int newCapacity = oldCapacity + (oldCapacity >> 1);)。扩容后,将原数组复制到新分配的内存地址上。根据动态扩容的机制,可知当元素越多时,空闲的空间就越大。序列化时只序列化size长度,而不会序列化数组长度。Arra转载 2020-10-11 18:28:52 · 97 阅读 · 0 评论 -
CountDownLatch:闭锁
线程是如何阻塞以及唤醒的呢?这里要提出LockSupport类,其有两个重要的方法://唤醒线程(底层实现依赖于操作系统)public static void unpark(Thread thread);//阻塞当前线程(底层实现依赖于操作系统)public static void park(Object blocker) unpark函数可以先于park调用。unpark函数为线程提供“许可(permit)”,线程调用park函数则等待“许可”,如果已经有许可,那么线程会马上再继续运行。a原创 2020-10-11 17:42:22 · 161 阅读 · 1 评论 -
for(;;) and while(true)
for(;;)比 while(true) 好原因:底层完全不同 编译前 编译后 while (1); mov eax,1 test eax,eax je foo+23h jmp foo+18h 编译前 编译后 for (;;); jmp foo+23h 对比之下,for翻译 2020-10-10 11:50:59 · 139 阅读 · 0 评论 -
emoji表情包字符分割问题引出的编码知识
【原创】经验分享:一个小小emoji尽然牵扯出来这么多东西?转载 2020-10-09 17:17:09 · 2838 阅读 · 0 评论 -
Java8 新特性 lambda表达式
将实体类聚合2次,并取分组后的对象的某字段的集合:@Datapublic class Po { private String id; // 组ID private String optTyp; // 加入/退出/移除 private String usrNam; // 用户名}Map<String, Map<String, List<String>>> userNames = pos.stream().collect( Collectors.group原创 2020-09-25 17:40:27 · 107 阅读 · 0 评论 -
原码反码补码,位运算,或与非
原码原码就是十进制数字最原始的二进制表示,在Java中,对于整数而言,其原码格式为最高位为符号位,该位上1表示负数而0表示正数,剩余位数为该数字的二进制表示。以Java中32位int型的整数2及-2举例:2的原码:00000000 00000000 00000000 00000010-2的原码: 10000000 00000000 00000000 00000010对于原码来说,正数和负数的原码只有符号位不同。反码正数的反码为其原码,负数反码是除了最高位的符号位外,其余位数取反(0改为1,1改原创 2020-09-24 09:34:04 · 460 阅读 · 0 评论 -
使用线程池注意事项
1.大厂开发规范,线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。1)FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。2)CachedThreadPool 和 ScheduledThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE.原创 2020-09-22 10:43:14 · 1186 阅读 · 0 评论 -
为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
BigDecimal的equals原理Compares this BigDecimal with the specified Object for equality. Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this meth转载 2020-09-21 19:41:01 · 183 阅读 · 0 评论 -
三目运算法中隐藏的问题
三目运算符condition ? 表达式1 :表达式2中,表达式1和2在类型对齐时,可能因自动拆箱导致NPE异常:类型对齐的自动拆箱场景:1.表达式1或表达式2,只要有一个是基本类型2.表达式1或2的值类型不一致,会强制拆箱成范围更大的那个类型例:Integer a = 1;Integer b = 2;Integer c = null;Boolean flag = false;// a*b的结果是int类型,那么c会强制拆箱成int类型,导致抛出NPE异常Integer result =原创 2020-09-20 00:15:05 · 391 阅读 · 0 评论 -
关于线程池任务报错的处理与理解
一个线程罢工的诡异事件https://mp.weixin.qq.com/s/dqOy2eeeOsDa1AN3nNUftgThreadPoolExcutor 线程池 异常处理 (上篇)https://www.cnblogs.com/wang-meng/p/10588637.html这2篇文章讲到一个线程池使用抛异常相关的问题处理.第一篇是原著,第二篇是引用与讲解.通读之后,发现第一篇文章只读一遍并不能完全理解意思,而第二篇文章则是没有搞懂第一篇作者的意思,对线程池任务的理解也不对....原创 2020-09-04 17:05:20 · 1083 阅读 · 0 评论