- 博客(72)
- 资源 (1)
- 收藏
- 关注
原创 Glide缓存原理
Glide使用了DiskCache+MemoryCache+activeResources三级缓存DiskCache是磁盘缓存,这个不用多说了MemoryCache和activeResources是两级内存缓存MemoryCache存储当前没有使用到的Bitmap,当MemoryCache中命中Bitmap后,该Bitmap又被缓存至activeResources中,并从MemoryCach...
2019-10-31 19:36:06 813
原创 移动平台游戏网络优化方案
目标对程序的包量和通信进行优化,从根本上减缓网络压力在出现网络异常的时候,保证玩家能快速重新连接到服务器并继续游戏,并且体验良好重连条件NetworkException,Timeout 在这种显式抛出异常的情况下,就说明网络已经无法顺利的和服务器进行连接,在这些消息类型中客户端这边就会触发断线重连流程但实际情况中,还有可能发生客户端网络并未断开,也并没有异常抛出,但是却出现客户端和...
2019-10-31 19:32:06 1079
转载 Android App及Activity回收流程分析
首先我们要找到整个内存不足然后回调回收activity的入口,在哪里呢?在ActivityThread里,通过之前的源码阅读我们发现,当一个新的app启动的时候,系统将从Zygote进程fork一个子进程出来,当然我们知道App不一定只存在一个进程,只要定义了Activity进程要游离,我们也可以将其游离,但本质上都是由核心Android 进程 Zygote 进程去启动,但app进程启动之后,A...
2019-08-08 11:08:39 842
转载 Window窗口机制——WindowManager,ViewRootImpl,View理解
在之前的文章中我们说到DecorView在handleResumeActivity方法中被绑定到了WindowManager,也就是调用了windowManager.addView(decorView)。而WindowManager的实现类是WindowManagerImpl,而它则是通过WindowManagerGlobal代理实现addView的,我们来看一下addView()方法publi...
2019-08-06 15:50:10 284
原创 Android GLSurfaceView模糊效果
import android.content.Context;import android.graphics.Bitmap;import android.graphics.drawable.Drawable;import android.opengl.GLException;import android.opengl.GLSurfaceView;import android.suppor...
2019-07-09 15:03:25 782
转载 移动平台游戏网络重连方案
1、背景 移动网络信号波动频繁,给移动游戏开发者带来诸多困扰,处理不好会造成较差的用户体验以及重复扣道具等严重问题。因此弱网络问题在TDR技术评审中作为客户端重点挑战项,并且弱网络专项测试达标后方能上线。本文就过往项目中遇到的问题给出一种比较通用解决方案。 2、网络连接方式 通常游戏客户端都是通过创建socket与服务器取得连接,但也会根据使用场景划分成两种连接方式:TCP连接和HTT...
2019-02-01 15:34:31 490
原创 LeakCanary原理分析
很久没有写博客了,最近年关将近,也有时间去回顾和温习一下之前的技术笔记,突然发现了之写的一篇,温故了一遍,感觉没有描述清楚,于是去网上又查了一下,千篇一律的都是这么几个步骤:1.通过Application.registerActivityLifecycleCallbacks()方法注册Activity生命周期,在onDestroy的时候进行watch2.将Activity通过弱引用KeyedW...
2019-01-23 15:38:55 243
转载 Netty 粘包、半包解决
Netty和Mina一样是NIO通讯工具框架,有一定区别也有一定相似之处。Netty和Mina在数据包处理、传输时都有可能会出现粘包和断包的情况,下图对粘包、断包进行描述。以下是网上对粘包的解决方式:1、消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格。2、在包尾增加回车换行符进行分割,例如FTP协议。3、将消息分为消息头和消息体,消息头中包含消息长度的字段,通常设...
2018-10-16 20:38:40 707 1
原创 基于Netty的Android长连接实现
1. 协议的确定协议头——4字节,标识协议体的长度协议体——包括4字节扩展信息+传参,其中扩展信息里包括协议加密类型,传参为key,value键值对类型的数据,数据格式为4字节key长度+key+4字节value长度+value2.协议加解密客户端随机生成16位密钥,通过RSA非对称加密方式将密钥同步给服务器密钥同步后,使用该密钥通过AES对称加密的方式对协议进行加密,然...
2018-08-06 23:03:26 5342 3
转载 JAVA LinkedBlockingQueue阻塞队列
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不会产生...
2018-04-02 16:35:30 522
原创 JAVA动态代理(JDK和cglib)
JAVA的动态代理(被代理类必须实现了接口) 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,...
2018-03-31 17:32:54 149
原创 JAVA线程的interrupt
interrupt()只是改变中断状态而已. interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,给受阻塞的线程抛出一个中断信号, 这样受阻线程就得以退出阻塞的状态。更确切 的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞, 那么,它将接收到一个中断异常(InterruptedException),从而提早...
2018-03-31 17:32:25 176
原创 JAVA正确地停止一个线程
如何正确停止线程关于如何正确停止线程,这篇文章(how to stop thread)给出了一个很好的答案, 总结起来就下面3点(在停止线程时):1. 使用violate boolean变量来标识线程是否停止2. 停止线程时,需要调用停止线程的interrupt()方法,因为线程有可能在wait()或sleep(), 提高停止线程的即时性3. 对于blocking IO的处理,尽量使用Interr...
2018-03-31 17:32:01 421
原创 为什么线程协作之前必须先获得锁?
为什么Object.wait()/notify()/notifyAll() 之前必须获得锁? 这是JLS的规定。Wait-notify机制是围绕监控器锁进行的,获得锁是很自然的前提,自身没有拿到锁之前,怎么能够尝试去操作靠锁来调控的线程呢?不过今天偶尔有时间,就看下Sun Hotspot是怎么实现这一机制的。当我们执行下面的代码时,线程会抛出异常java.lang.IllegalMonitorSt...
2018-03-31 17:31:32 697
原创 JAVA NIO 之Channel
Channel接口提供缓冲区与实体文件或套接字连接的一个抽象——通道,用于字节缓冲区和位于通道另一侧(通常是一个文件或套接字)之间有效地传输数据。多数情况下,通道与操作系统的文件描述符(File Descriptor)和文件句柄(File Handler)有着一对一的关系。虽然通道比文件描述符更广义,但我们经常使用到的多数通道都是连接到文件描述符的。1.通道基础Channel接口继承关系下面是ch...
2018-03-31 17:29:11 230
转载 JAVA AIO
转载Reactor and Proactor的内容系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型[1, 2]. 阻塞型I/O意味着控制权只到调用操作结束了才会回到调用者手里. 结果调用者被阻塞了, 这段时间了做不了任何其它事情. 更郁闷的是,在等待IO结果的时间里,调用者所在线程此时无法腾出手来去响应其它的请求,这真是太浪费资源了。拿read()操作来说吧, 调用此函数的代码会一直僵在此...
2018-03-31 17:27:53 709
原创 java io以及unix io模型
这部分的东西在网络编程经常能看到,不过在所有IO处理中都是类似的。IO请求的两个阶段: 等待资源阶段:IO请求一般需要请求特殊的资源(如磁盘、RAM、文件),当资源被上一个使用者使用没有被释放时,IO请求就会被阻塞,直到能够使用这个资源。 使用资源阶段:真正进行数据接收和发生。 举例说就是排队和服务。 在等待资源阶段,IO分为阻塞IO和非阻塞IO。 ...
2018-03-31 17:26:53 207
原创 I/O基本概念
IO相关的内容包含:1.缓冲区操作2.内核空间与用户空间3.虚拟内存4.分页技术5.面向文件的IO和流IO6.多工IO(就绪性选择——IO多路复用)1. 缓冲区进程执行io操作,归结起来,也就是向操作系统发出请求,让它要么把缓冲区里的数据排干,要么用数据把缓冲区填满。进程使用这一机制处理所有数据的操作。io操作过程:用户进程使用read()系统调用,要求其缓冲区被填满,内核即向磁盘控制硬件发出命令...
2018-03-31 17:25:45 15545
原创 文件系统中的逻辑块、物理块和扇区之间的关系
扇区(sector):硬件(磁盘)上的最小的操作单位,是操作系统和块设备(硬件、磁盘)之间传送数据的单位。 block由一个或多个sector组成,文件系统中最小的操作单位;OS的虚拟文件系统从硬件设备上读取一个block,实际为从硬件设备读取一个或多个sector。对于文件管理来说,每个文件对应的多个block可能是不连续的;block最终要映射到sector上,所以block...
2018-03-31 17:23:42 8378
转载 基于栈和基于寄存器的虚拟机
1、解析器与解释器 解析器是parser,而解释器是interpreter。两者不是同一样东西,不应该混用。 前者是编译器/解释器的重要组成部分,也可以用在IDE之类的地方;其主要作用是进行语法分析,提取出句子的结构。广义来说输入一般是程序的源码,输出一般是语法树(syntax tree,也叫parse tree等)或抽象语法树(abstract syntax tree,A
2018-02-01 18:35:04 543
转载 性能监控工具
一、图形化监控工具: 在JDK安装目录bin下面有两个可视化监控工具 1. JConsole(Java Monitoring and Management Console) 基于JMX的可视化管理工具。 2. VisualVM(All-in-one Java Troubleshooting Tool)随JDK发布的最强大的运行监视和故障处理程序。 推荐使用VisualVM,他有很多插件,
2018-02-01 18:25:11 257
原创 JVM内存回收策略
对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程有限分配在TLAB上。少数情况下也可能会直接分配在老年代。内存分配策略:对象优先在Eden分配大多数情况情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。 注:新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java队形大多都是具备朝...
2018-02-01 17:48:40 196
转载 Heap分区和分代概念
Heap分区的目的 1. 为了分代:不同代的对象放到不同的内存分区中,实现“代提升”,也方便实现对不同分代采用不同的垃圾收集算法。 2. 垃圾收集算法需要:新生代GC使用到复制算法,该算法需要将对应的分区划分成三个分区:Eden/S0/S1。术语 Generation代 - YongGeneration/NewGeneration:新生代,在Eden/S0/S1的存活的对象。 -
2018-02-01 17:47:41 345
原创 JVM垃圾收集GC
1.如何判断垃圾对象1)引用计数算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能再被使用的。 引用技术算法实现相对简单,判定效率也比较高(ActionScript3,Python语言等都使用此算法),但是java虚拟机没有使用这个算法,主要原因是引用技术算法很难解决循环引用的问题2)可达性...
2018-02-01 17:46:19 163
原创 引用类型
从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。下图为对象层次的引用1强引用 平时我们编程的时候例如:Object object=new Object();那object就是一个强引用了。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足
2018-02-01 17:40:02 189
原创 JAVA 内存区域
运行时数据区域java虚拟机在执行java程序的时候会把它管理的内存分为若干不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间。根据java虚拟机规范规定,虚拟机所管理的内存区域包括以下几个区域:1.程序计数器(线程私有) 程序计数器是一块较小的内存区域,它是当前线程所执行的字节码的行号指示器,在虚拟机的实现里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要...
2018-02-01 17:38:36 197
原创 JVM 内存溢出
在实际编程过程中,会遇到一些OutOfMemory(OOM)异常。通过模拟。我们可以直接指出这些场景的本质,从而在纷繁复杂的千万行代码中避免这样去Coding。导致OOM的情况有多种,包括Java或Native Method Stack的内存不足或者栈空间溢出、Heap内存溢出、Non-heap内存溢出、Direct Memory溢出。1.Java Method Stack栈溢出模拟什
2018-02-01 17:30:49 228
转载 JAVA8 Lambda表达式
1. 什么是λ表达式λ表达式本质上是一个匿名方法。让我们来看下面这个例子: public int add(int x, int y) { return x + y; }转成λ表达式后是这个样子: (int x, int y) -> x + y;参数类型也可以省略,Java编译器会根据上下文推断出来: (x, y) -> x + y; //返...
2014-07-30 14:54:03 721
原创 基于aapt实现全尺寸解析apk图标
package com.xunlei.app.tools;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;imp
2013-08-15 17:15:00 3918 1
转载 Apache,Tomcat集群和负载均衡
环境说明 Apache :apache_2.0.55 1 个 Tomcat: apache-tomcat-5.5.17 (zip版) 2个 mod_jk:: mod_jk-apache-2.0.55.so 1个第一部分:负载均衡 负载均衡,就是apache将客户请求均衡的分给tomcat1,tomcat2....去处理
2012-08-16 15:28:41 679
转载 Oracle system用户的实际权限
Oracle system用户登录数据库也会出现问题吗,下文对Oracle system用户的实际权限作了分析讨论,供您参考学习。之前新建了一个数据库,通过pl/sql developer登录,使用的是Oracle system用户,身份为SYSDBA,结果报错:insufficient privileges( 权限不足 )。最后只好让sys用户登录后执行grant sysdba to sys
2012-07-12 17:09:57 4438
转载 HttpURLConnection学习
最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。在Java中可以使用HttpURLConnection发起这两种请求,了解此类,对于了解soap,和编写servlet的自动测试代码都有很大的帮助。下面的代码简单描述了
2012-05-15 11:24:53 603
转载 使用XFire+Spring构建Web Service
早前的一篇文章,今天才发表,贴上来,:)请勿转载原文出处:http://tech.it168.com/j/2007-09-26/200709260923046.shtmlXFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用。相对于Axis来说,目前XFire相
2011-11-22 14:54:41 918
原创 applicationContext.getBean()
private static ApplicationContext ctx= new ClassPathXmlApplicationContext( "spring/ws-client.xml");private static Cache cache = (Cache) ctx.getBean("cache"); 当bean继承spring 的FactoryBean时,使用ap
2011-11-22 14:21:38 34097
转载 Spring中HttpInvoker远程方法调用使用实例
代码结构图如下:客户端通过Spring的HttpInvoker,完成对远程函数的调用。涉及的类有:客户端调用User类的服务UserService,完成对实现类UserServiceImpl的addUser(User u)方法调用。其中User类为普通Pojo对象,UserService为接口,UserServiceImpl为UserService的具体实现。代码如下:publ
2011-11-21 14:47:58 4481
原创 linux下apache的安装及so文件的编译
apache编译安装 [root@hostlocal~]# ls // 你会看到你下载的httpd-2.2.9.tar.gz. [root@hostlocal~]# tar –zxvf httpd-2.2.9.tar.gz // 解压后为httpd-2.2.9 [root@hostlocal~]# mkdir –p /usr/local/web/apache/ //在这
2011-10-27 13:46:44 5672
原创 poi支持excel2007遇到的问题
1 首先确定导入的包没有遗漏去apache/poi官网上下载poi-bin-3.6-20091214.zip 需要的包都在里面2 导入包poi-3.6-20091214.jar poi-ooxml-3.6-20091214.jarpoi-scratchpad-3.6-20091214.jarpoi-ooxml-schemas-3.6-20091214.jarxmlb
2011-10-21 17:42:04 7210
原创 aop+自定义注解实现操作日志记录
记录日志的自定义注解 package com.apabi.leopard.annotation;import java.lang.annotation.Retention;import java.lang.annotation.Target;import java.lang.annotation.RetentionPolicy;import java.lang.anno
2011-09-20 11:21:19 11984 1
原创 web.xml中listener作用及使用
一.WebContextLoaderListener 监听类它能捕捉到服务器的启动和停止,在启动和停止触发里面的方法做相应的操作!它必须在web.xml 中配置才能使用,是配置监听类的二.下面是搜集的一些listener方面的知识简例一监听用户上线与退出,显示
2011-09-08 14:21:06 81220 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人