JDK动态代理和CGLib代理实现分析

1、JDK动态代理 JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。 其中 InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一 起。 而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。 InvocationHandler接口: public interface Inv ...

内存泄露排查

现象: (1)数据导出无反应,处于等待状态 (2)其他页面相应特别慢 1、查看日志 [/enroll2//dataExport/create.json?_input_charset=UTF-8&filter_nature_group_id=36&filter_nature_topic_id=279&filter_nature_member_id=&filter_common_login_id=&fi ...

深入理解jvm虚拟机

每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境)上的。JRE中最重要的部分是Java虚拟机(JVM),JVM负责分析和执行Java字节码。Java开发人员并不需要去关心JVM是如何运行的。在没有深入理解JVM的情况下,许多开发者已经开发出了非常多的优秀的应用以及Java类库。不过,如果你了解JVM的话,你会更加了解Java的,并且你会轻松解决那些看似简单但是无从下手的问题。 本系列主要从以下几个方面进行分 ...

线程池的配置和监控

1、合理的配置线程池 要想合理的配置线程池,就必须首先分析任务特性,可以从以下几个角度来进行分析: 任务的性质:CPU密集型任务,IO密集型任务和混合型任务。 任务的优先级:高,中和低。 任务的执行时间:长,中和短。 任务的依赖性:是否依赖其他系统资源,如数据库连接。 任务性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务配置尽可能小的线程,如配置Ncpu+1个线程的线程池。IO密集型任务则由于线程并不是一直在执行任务,则配置尽可能多的线程,如2*Ncpu。 ...

深入理解java内存模型

java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰java程序员,本文试图揭开java内存模型神秘的面纱。 本文大致分三部分: 重排序与顺序一致性; 三个同步原语(lock,volatile,final)的内存语义,重排序规则及在处理器中的实现; java内存模型的设计目标,及其与处理器内存模型和顺序一致性内存模型的关系。 深入理解java内存模型(一)——基础 深入理解java内存模型(二)——重排序 深入理解java内存模型(三)——顺序一致性 ...

线程池的拒绝策略

默认提供4种拒绝策略,可以自定义实现RejectedExecutionHandler进行扩展 1、AbortPolicy 2、DiscardPolicy 3、DiscardOldestPolicy 4、CallerRunsPolicy AbortPolicy,无法处理任务任务的时候,直接抛出异常, public static class AbortPolicy implements RejectedExecutionHandler { /** ...

线程池BlockingQueue排队策略

排队有三种通用策略 1、直接提交。无缓冲等待队列SynchronousQueue,它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集合时出现锁定。直接提交通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务。当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。 2、无界队列。使用无界队列(例如,不具有预定义容量的 Li ...