java
文章平均质量分 66
mengml_smile
我就是我 不一样的自我
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
类加载一分钟
如果一个类加载器收到了加载类的请求,它会先把请求委托给上层加载器去完成,上层加载器又会委托上上层加载器,一直到最顶层的类加载器;如果上层加载器无法完成类的加载工作时,当前类加载器才会尝试自己去加载这个类。原创 2024-12-03 10:26:55 · 265 阅读 · 0 评论 -
手写AOP
AOP linkJointPoint 连接点 不需要实现 可以被选择来进行增强的方法点Aspect切面 需要实现PointCut 切入点(选择增强的方法 注解/Aspect表达式(spring早期是正则实现))String targetString methodAdvice-interface 增强功能 反射调用 PointCutinvoke(Object target,Method,Object[] args)增强反射 method.invoke(Object targe.原创 2021-01-13 15:57:01 · 154 阅读 · 0 评论 -
对象内存分配
TLAB: 同步效率过低每个线程申请一份空间(优先使用之后放入公共空间)原创 2021-02-21 22:08:09 · 139 阅读 · 0 评论 -
JVM一分钟
1.GC算法 1.标记清除算法 1.遍历GC Roots,然后将存活的对象标记 2.回收未被标记的对象 缺点 效率不高 空间会产生大量碎片 2.复制算法 将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另外一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾回收 如果内存中的垃圾对象较多,需要复制的对象就较少,这种情况下适合使用该方式并且效率比较高,反之,则不适合 优点:在垃圾对象多的情况下,效率较高。清理后,内存无碎片 缺点:原创 2020-08-24 19:44:39 · 3367 阅读 · 0 评论 -
jdk1.8新特性
jdk1.8新特性Lambda Lmabda表达式的语法总结: () -> () (用逗号分隔的参数列表,–>符号,函数体三部分) 无参数无返回值 () -> System.out.println(“Hello WOrld”) 有一个参数无返回值 (x) -> System.out.println(x) 有且只有一个参数无返回值 x -> System.out.println(x) 有多个参数,有返回值,有多条lambda体语句 (x,y) -> {Syst原创 2020-10-12 10:54:49 · 1684 阅读 · 0 评论 -
poi
poi 两种模式1.用户模式一次性加载excel(xml文档以一棵DOM树的形式存放在内存中) 数据量大会OOM2.SAX模式(XSSF and SAX(event API))逐行读取xml解析(excel有03和07两种版本,两个版本数据存储方式截然不同,sax解析方式也各不一样 api复杂不利于实现)EasyExcel官网https://www.yuque.com/easyexcel/doc/easyexcel原理1.对poi的封装和改版2.文件解压文件读取通过文件形式(通过磁盘可以原创 2020-08-27 17:14:37 · 3850 阅读 · 0 评论 -
数据结构-tree
树根节点度 一个节点有多少个分支,度就是多少叶子节点 度为0的节点就是叶子节点(没有分支的节点都是叶子节点)树的度 一棵树中,最大的结点的度称为树的度深度 指从根节点到该节点的最长简单路径边的条数(根节点和叶子节点 深度和高度是一样的)高度 该节点到叶子节点的最长简单路径边的条数(根节点和叶子节点 深度和高度是一样的)二叉树树的度 不超过2的就是二叉树二叉搜索树(binary search tree)特征 左子树中所有节点的值小于根的值 右子树中所有节点的值大于或等于原创 2020-08-26 18:18:49 · 3410 阅读 · 0 评论 -
java中内存泄露
java中内存泄露1、静态集合类,如HashMap、LinkedList等(可以使用WeakHashMap) 如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放, 从而造成内存泄漏。简单而言,长生命周期的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用, 但是因为长生命周期对象持有它的引用而导致不能被回收。2、各种连接,如数据库连接、网络连接和IO连接等 当不再使用时,需要调用close方法来释放与数据库的连接。只有连接被关闭后,垃圾回收器才会原创 2020-07-28 19:38:28 · 3390 阅读 · 0 评论 -
CAS和Unsafe
CASCompare-And-Swap是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换CAS操作是原子性的,所以多线程并发使用CAS更新数据时,可以不使用锁Lock底层的AbstractQ原创 2020-07-21 19:57:06 · 3261 阅读 · 0 评论 -
java中的锁
java中的锁1.乐观VS悲观 乐观锁适合读操作多的场景,悲观锁适合写操作多的场景 1.悲观锁 数据库 select column from table where column='xx' for update; synchronized Lock 2.乐观锁 1.版本号 update 表 set 金额 = 120,version = version + 1 where 金额 = 100 and version = 0; 2.CAS(Compare-and-Swap比较并替原创 2020-07-20 18:07:41 · 3291 阅读 · 0 评论 -
HashMap源码
属性public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { //序列号,序列化的时候使用。 private static final long serialVersionUID = 362498820763181265L; /**默认容量,1向左移位4个,00000001变成00010000,也就是2原创 2020-07-20 12:49:25 · 3111 阅读 · 0 评论 -
线程池ThreadPoolExecutor
ThreadPoolExecutorjava.uitl.concurrent.ThreadPoolExecutor四个构造方法中重要参数corePoolSize,maximumPoolSize,keepAliveTime都是volatile 声明( volatile 变量用来保证线程之间的可见性)corePoolSize线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程,这个参数跟后面所说的线程池的实现原理有非常大的关系。在创建了线程原创 2020-06-23 14:25:51 · 2699 阅读 · 0 评论 -
NIO
BIO NIO NIO2(AIO)计算机用户空间(进程使用的空间) 应用程序运行在用户空间计算机内核空间 操作系统和驱动程序运行在内核空间BIO(blocking I/O) 在java进程(用户空间)向内核空间发起读取请求之后 1.系统内核和硬盘之间的复制过程(内核将硬盘中data copy到内存中) 2.内核空间把数据copy给用户空间的过程 1和2的过程 java进程一直是阻塞状态 BIO加多线程(tomcat) 这种模式具备一定的并发处理能力NIO(nonblo原创 2020-06-19 18:29:37 · 2739 阅读 · 0 评论 -
手动开启事务/保存点/隐式发出commit的语句
手动开启事务/保存点/隐式发出commit的语句1.手动开启事务 @Autowired DataSourceTransactionManager dataSourceTransactionManager; @Autowired TransactionDefinition transactionDefinition; TransactionStatus transactionStatus...原创 2019-09-04 16:05:38 · 4337 阅读 · 0 评论
分享