摘要: GC 的概念 garbage Collection 垃圾回收 1960 年,List语言使用了GC java中,GC的对象是堆空间和永久区 GC 算法 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当 阅读全文
posted @ 2017-08-09 10:33 程序员小李 阅读(546) 评论(0) 推荐(0) 编辑
摘要: JVM 启动流程: 1、通过java 命令 启动JVM 2、装置配置(根据当前路径及系统版本寻找jvm.cfg) 3、根据配置找jvm.dll 4、使用jvm.dll初始化JVM 5、找到main,并执行 JVM 的内部结构 PC寄存器: 1、每个线程都有一个PC寄存器 2、在线程创建的时创建 3、 阅读全文
posted @ 2017-08-08 10:07 程序员小李 阅读(500) 评论(0) 推荐(0) 编辑
摘要: Semaphore 概述 共享锁,运行多个线程同时临界区 主要接口 public void acquire()public void acquireUninterruptibly()public boolean tryAcquire()public boolean tryAcquire(long t 阅读全文
posted @ 2017-05-27 00:34 程序员小李 阅读(1374) 评论(2) 推荐(2) 编辑
摘要: ReentrankLock 分为 非公平锁及公平锁 首先我们看一下它里面有哪些属性: tryAcquire方法中,先 判断当前state值是否是0,若为0 ,则可进行尝试加锁。若不为0,判断作这个加锁操作的是否为当前线程,若为当前线程,则直接累加,然后更新state值 setExclusiveOwn 阅读全文
posted @ 2017-05-23 23:18 程序员小李 阅读(336) 评论(0) 推荐(0) 编辑
摘要: 这两天学习无锁的并发模式,发现相比于传统的 同步加锁相比,有两点好处1.无锁 模式 相比于 传统的 同步加锁 提高了性能 2.无锁模式 是天然的死锁免疫 下来介绍无锁的Vector LockFreeVector 它的结构是: 从这里我们可以看到,它的内部是采用的是 无锁的引用数组, 数组嵌套数组 相 阅读全文
posted @ 2017-05-22 23:13 程序员小李 阅读(1078) 评论(0) 推荐(0) 编辑
摘要: AtomicInteger可以保证硬件上的原子操作 1.主要原理 CAS操作 在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不同,则更新失败, CAS就是Compare and Swap的意思,比较并操作 AtomicInteger主要是调用了 阅读全文
posted @ 2017-05-21 15:21 程序员小李 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 首先介绍一下两个方法: 1.通过Map进行实现 主键为Thread ,value 为数据, 主要思路为:与线程绑定,不同的线程之间的数据相互独立 2.通过ThreadLocal 实现 首先先介绍一下ThreadLocal 的原理 每个Thread ,都有一个ThreadLocalMap ,所以每次通 阅读全文
posted @ 2017-05-21 14:58 程序员小李 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 本随笔只由于时间原因,我就只写写思想了二维数组最大子数组之和,可以 引用 一维最大子数组之和 的思想一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了我们有一个最初的二维数组a[n][m],找它的最大子数组之和1.我们先建立一个新的二维数组b[n][m] 二维数组b[j][k] 存放的是a[j][k](0int main(){ int i,j; int a[3][3]={-1,-2,1,-3,4,2,3,4,-5}; int b[3][3]; int max=a[0][0]; for(i=0;i=0&&b[i][j-1]>=0) { if(b[i][j-1]& 阅读全文
posted @ 2014-03-26 09:45 程序员小李 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 内存溢出(OOM)的原因 JVM的内存空间 : 堆、永久区、线程栈、直接内存 堆溢出:java.lang.OutOfMemoryError: Java heap space 解决方法:增大堆空间,及时释放内存 永久区溢出: Caused by: java.lang.OutOfMemoryError: 阅读全文
posted @ 2017-08-10 14:11 程序员小李 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 类装载器验证流程 1、加载 取得类的二进制流 转化为方法区的数据结构 在java堆中生成对应的 java.lang.Class对象 2、链接 验证 目的:保证Class流的格式是否正确 文件格式是否正确、元数据验证、字节码验证、符号引用验证 准备 分配内存,并为类设置初始值(在方法区中) publi 阅读全文
posted @ 2017-08-10 09:20 程序员小李 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 堆的回顾 串行收集器 1、最古老,最稳定 2、效率高 3、停顿时间长 4、-XX:+UseSerialGC 新生代和老年代使用串行回收 新生代复制算法 老年代标记-压缩 并行收集器 PerNew 1、-XX:+UserPerNewGC 新生代 并行回收 老年代 串行回收 2、多线程 ,多核支持 3、 阅读全文
posted @ 2017-08-09 14:49 程序员小李 阅读(650) 评论(0) 推荐(0) 编辑
摘要: Trace跟踪参数 -verbose:gc 打开gc的跟踪方式 -XX:+PrintGC 可以打印gc的简要信息 -XX:+PrintGCDeteils 打印gc的详细信息 -XX:+PrintGCTimeStamps 打印GC发生的时间戳 -Xloggc:log/gc.log 指定gc log位置 阅读全文
posted @ 2017-08-08 14:05 程序员小李 阅读(437) 评论(0) 推荐(0) 编辑
摘要: 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务 阅读全文
posted @ 2017-06-02 10:43 程序员小李 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 我做了一个二维码的一个签到功能 通过JQuery来生成二维码 但是没想到在IE9,10 以上都没有问题 然后客户的机子上竟然是IE8, 还好找到了问题 在IE8 下js报错 getContext 找不到、 解决方案:修改jquery.qrcode.min.js 源码: 将 大家可以看到代码:若 re 阅读全文
posted @ 2017-05-31 17:26 程序员小李 阅读(2201) 评论(0) 推荐(0) 编辑