Java基础
文章平均质量分 51
Golden_Dog
这个作者很懒,什么都没留下…
展开
-
NIO 与 BIO 小结
1. BIO 是阻塞式的;NIO是非阻塞式的以调用Read(Buffer)为例:阻塞这层含义主要在于数据并没有在本机的缓存区,在等待server传输数据的过程,本机属于停滞状态,啥事不干,因此BIO被称为阻塞而NIO真正调用Read(Buffer)方法之前一定需要check数据是否已经准备好在缓存区了,因此NIO为非阻塞2. BIO;NIO都是同步的通俗来说:所谓同步就是方原创 2016-12-26 15:02:28 · 219 阅读 · 0 评论 -
String 的特殊性
public class StringTest { String a = new String("abc"); char[] b = {'a','b','c'}; public void exchange(String a, char[] b){ a = "new avl"; b[0] = 'n'; } public static void main(String[] a原创 2018-01-18 11:58:37 · 224 阅读 · 0 评论 -
FutureTask 理解
1. FutureTask主要有三个方法:run/get/cancela. run执行前如果state = NEW那么直接执行执行前如果state !=NEW那么直接结束执行中可能被cancel方法interruptb. getrun执行结束分两种情况:正常结束/Exception正常结束get得到结果/Exception时get会throw Exceptionc.原创 2018-01-18 15:30:26 · 179 阅读 · 0 评论 -
for i 与 Iterator效率比较
看Collections.fill方法的实现 public static void fill(List list, T obj) { int size = list.size(); if (size < FILL_THRESHOLD || list instanceof RandomAccess) { for (int i=0;原创 2018-01-18 20:34:53 · 495 阅读 · 0 评论 -
Java RMI实现原理
1. 启动Registry服务:registry = LocateRegistry.createRegistry(1099);2. 处理请求:Registry是监听1099端口,通过什么传输内容呢?传输的又是什么内容呢?底层协议肯定是不是TCP/IP?不出意料,也是通过socket编程来listen/accept。而且这里是简单的同步阻塞式listen->sun.rmi.transport....原创 2018-04-16 00:02:10 · 1294 阅读 · 0 评论 -
JVM调优--排查经历(CMS的弊端)
背景:脚本任务,多线程执行,执行频次非常高;但是执行效率不高,从JVM入手做调优sh-4.2# jstat -gc 64 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT...原创 2018-10-14 13:43:30 · 1415 阅读 · 0 评论 -
常量池 - 运行时常量池
常量池:javap -verbose xxxnotice: xxx is a compiled class file以上指令显示的:Constant pool 就是所谓的常量池,该内容的大小固定,在编译期就已经固。存储的内容类似于:#1 = Methodref #2 = Class #3 = Methodref #4 = Fieldref #5 = Methodref...转载 2018-10-10 08:51:10 · 335 阅读 · 0 评论 -
ThreadPoolExecutor 运作机制再次理解 ----- 一次小坑记
private static final ExecutorService executorService = new ThreadPoolExecutor(20, 25, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(1), new ThreadPoolExecutor.CallerRunsPolicy());这里核心线程数20...原创 2018-10-25 20:39:13 · 1035 阅读 · 0 评论 -
JVM invokedynamic 和 lambda
invokedynamic(每个含有该指令的地方都可以称为“动态调用点”)https://blog.csdn.net/raintungli/article/details/54910152这篇文章外加 《深入理解java虚拟机》p258 讲的很清楚了 lambda实现非常类似于 总结:a. invokedynamic与MethodHandle机制作用是一样的,一个采用字节码和Class...原创 2018-10-29 22:26:23 · 676 阅读 · 0 评论 -
JVM 调优
1. JVM调优基本原则(三选二)低延迟 高吞吐 大内存 2. 通用准则堆大小设置应为老年代活跃数据大小的3-4倍 新生代大小设置应为老年代活跃数据大小的1-1.5倍 老年代应为活跃数据大小的2-3倍 新生代至少为java堆大小的10%内存占用大小 活跃数据计算:fgc后 CMS垃圾收集开销在3%及以下时,就差不多到极限了 3.年轻代首先年轻代目前所有的算法都...原创 2018-10-27 22:40:29 · 219 阅读 · 0 评论 -
OOM - 实例一
线上脚本任务出现了OOM,dump文件有27G左右,首先还是从线程去分析jstack -l pid查看线程,发现有同一个任务触发存在多个,排查下来定位是sleep时间过长,导致吞吐量不够,每天的任务会出现24h内都无法处理完成的情况。 经验代码实现要合理,尽量减少全局变量hold住大对象 脚本类型的任务吞吐量,触发时间,触发方式等都需要提前预估好 排查jstack文件时,p...原创 2018-11-03 07:51:30 · 390 阅读 · 0 评论 -
JVM 线程无法回收排查 -- 实例
问题排查步骤:1. jstack查看jvm线程信息,发现已经有1w+线程存在2. 看命名规范:pool-11238-thread-1大量存在,且处于waiting状态,由此可以猜测代码中存在一种ThreadPoolExecutor调用,coresize设置为1的地方每次调用完没有回收3. 登录服务器,jmap -dump 文件,下载至本地4. 使用jvisualvm工具查看dump...原创 2018-10-30 23:15:50 · 2288 阅读 · 0 评论 -
OOM -- 调优实例二(docker OOM退出)
背景:docker偶尔会出现直接OOM退出,通过jstat -gccasue xxx发现老年代持续增加,直到整个docker oom排查:dump 下来文件发现真实存活的对象并不多;如果采用jmap -dump:live xxx时触发了FGC后,老年代会急剧减少分析:从现象显然可知:在老年代还没有触发时,整个机器都崩溃了再排查了以下jvm的xmx和xmn发现...原创 2019-05-13 22:25:08 · 718 阅读 · 0 评论 -
java 序列化
1. 序列化需要实现接口Serializable2. 序列化不会处理static以及transient标记的属性3. readObject/writeObject方法的实现可以自定义写入的内容,这里需要自己去控制写入和读取的顺序。一般情况下需要首先运行s.defaultReadObject()/s.defaultWriteObject()自动的把序列化属性处理好4. 序列化中对于如果多个对象属于同原创 2018-01-17 22:53:23 · 158 阅读 · 0 评论 -
AQS 小结
public final void acquireSharedInterruptibly(int arg) throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); if (tryAcquireSh原创 2018-01-01 20:09:08 · 163 阅读 · 0 评论 -
ForkJoinPool 使用的错误写法
compute分出多个task后:以task1,task2为例错误做法:1)依次执行task1.fork(),task2.fork()2)依次执行task1.join(),task2.join()正确做法:1)直接调用invokeAll(task1,task2)fork():把task置入当前ForkJoinWorkerThread的queue中,等待被消费原创 2018-01-23 08:56:43 · 4278 阅读 · 1 评论 -
使用classloader加载文件
在使用classloader加载文件之前首先要知道当前的classloader的种类:ExtClassLoader: 对应的是jre\lib\ext 目录AppClassLoader: 对应的是classpath用户自定义的需要具体分析,例如tomcat 的standardClassloader:对应WEB-INF\classes;WEB-INF\lib在确定了该C原创 2016-12-25 15:49:45 · 373 阅读 · 0 评论 -
ThreadPoolExecutor一些小结
1. ThreadPoolExecutor 就是一个帮你管理线程的工具,让你脱离自己启动线程管理线程的烦恼。2. ThreadPoolExecutor 部分与生产者消费者模式类似。假设做如下抽象:产品:用户需要用来多线程运行的类生产者:调用ThreadPoolExecutor.submit(产品) 的类消费者:ThreadPoolExecutor.Worker类原创 2016-10-18 21:52:52 · 564 阅读 · 0 评论 -
生产者与消费者模式初步小结
1.基本的生产者消费者:生产者完成生产之后通知消费者开始消费。消费者消费完成之后通知生产者开始生产。2.生产者消费者设计模式在生产者与消费者之间添加同步队列来实现线程的控制。同步队列:a.同一时刻只允许一个线程插入或移除元素。可以由不同的数据结构组成,基础功能相同。b.与原先由生产者消费者直接相互控制不同,现在采用同队队列来对生产者消费者线程进行控制。简化了抽象原创 2016-10-16 14:04:12 · 257 阅读 · 0 评论 -
ThreadPoolExecutor 一图
ThreadPoolExecutor的流程图原创 2017-09-13 22:09:12 · 231 阅读 · 0 评论 -
Dynamic Proxy of JDK and Cglib
1. JDK动态生成Class来实现target的所有接口,具体实现为nvocationHandler的invoke。2. Cglib动态生成Class来继承target,具体实现方法分两种:一: 与原实现方法同名的,实现为Custom CALLBACKS>THREAD_CALLBACKS>STATIC_CALLBACKS的顺序去调用对应的intercept方法二: 修原创 2017-12-09 11:15:41 · 170 阅读 · 0 评论 -
理解static与非static部分的实例化
1. static属性的实例化过程查看编译文件就会发现,static块会在最开始自动加上static属性值的初始化内容,顺序是按照书写依次执行,再然后是static块本身的内容。static{static属性值A 赋值操作static属性值B 赋值操作static块本身的赋值操作}2.非static 属性的实例化过程查看编译文件会发现,所有的构造原创 2017-11-26 12:04:32 · 463 阅读 · 0 评论 -
ReentrantLock 一图
ReentrantLock 中的FairSync实现基本流程图如下:lock() 与 lockInterruptibly()比较就是,lock是在Park Self之后, 一旦醒来如果是被中断过的只是简单的做个标记,等真正拿到锁了,才会去处理中断信息。lockInterruptibly是在Park Self之后,一旦醒来如果发现被中断过,直接throw InterruptedE原创 2017-09-06 22:17:56 · 178 阅读 · 0 评论 -
DriverManager 源码分析
1. Class.forName("com.mysql.jdbc.Driver");在初始化的时候会执行注册当前Driver给DriverManager static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException原创 2017-12-26 09:09:52 · 963 阅读 · 0 评论 -
ThreadPoolExecutor底层实现 小结
1. FutureTask的实现 public Future submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture ftask = newTaskFor(task, null); execute(ftask);原创 2017-12-14 21:39:31 · 198 阅读 · 0 评论 -
ReentrantLock底层实现 小结
1. FairSync 的 state & tail & headtail:尾节点, 链表head:头节点, 链表state:锁状态简单来说lock()1. 看看state状态,合适就拿着state直接开跑2. 不合适就在把自己放在head链表最后3. 首先找到自己前一个状态合格的哥们,如果前面哥们的状态是CANCELLED,那需要把这哥们从head/tail链表中原创 2017-12-14 22:03:24 · 656 阅读 · 0 评论 -
方法内部类/匿名内部类 局部变量需要被标记为final 原因
public class InnerClassTest { public int classLevel = 0; public void test(final long innerMethodParam){ final Integer methodLevel = new Integer(2); new MethodInnerClass(){ public void inne原创 2018-01-13 15:04:13 · 351 阅读 · 0 评论 -
加载 - 链接 - 初始化 中的锁
加载:protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { ...... return c; }原创 2018-01-14 11:07:26 · 330 阅读 · 0 评论 -
ForkJoinPool 源码分析
一个ForkJoinPool 对应多个ForkJoinWorkerThread一个ForkJoinWorkerThread 对应多个ForkJoinTask以一个简单的求和Task为例:public class ForkJoinTest { public static void main(String[] args) { ForkJoinPool fjp = ne原创 2018-01-22 18:50:34 · 1055 阅读 · 1 评论 -
同步异步 阻塞非阻塞 理解
同步异步 阻塞非阻塞 理解前言同步 vs 异步同步异步总结阻塞 vs 非阻塞基本概念阻塞非阻塞总结总结NIO为什么是同步非阻塞?其他前言对同步异步 阻塞非阻塞做一下简单的总结同步 vs 异步同步调用方被调用方发起请求处理请求返回结果处理返回结果下一步调用方被调用方调用方一直等到返回结果才执行下一步;调用方依赖被调用方异步调用方被调用方发起请求返回结果下一步等待资源执行请求处理请求调...原创 2019-09-14 19:53:57 · 185 阅读 · 0 评论