- 博客(40)
- 资源 (2)
- 收藏
- 关注
原创 项目经验1:缓存穿透
昨天线上系统报警,发现数据库QPS很高。经过排查后,发现是有一个接口没有走缓存,每次请求都透到了数据库。于是,找到接口代码看了一下。大致如下:(只是个描述逻辑的代码)CustomerObject obj = redisService.get("myKey");if (obj == null) { obj = CustomerObjMapper.findBy(id); redis...
2019-06-23 15:33:46
414
原创 Java8 effectively final
在Java8之前,我们在匿名内部类中如果使用外部局部变量a,那么变量a必须被声明为final的。但从Java8开始,我们不需要再去显示地声明这个局部变量为final了。
2019-03-31 19:23:38
2249
原创 Java反序列化与对象的创建
Java反序列化,创建对象,不会调用目标对象的构造方法。这是为什么?那么反序列化是如何创建对象的,让我们来看看他的底层机制吧。
2019-02-24 19:45:08
1951
2
原创 Java SPI机制
**SPI(Service Privoder Interface)**,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。
2019-01-26 19:33:12
403
原创 Java字节码结构剖析五:异常表
异常表实际上是Java代码的一部分,编译器使用异常表而不是简单的跳转命令来实现Java异常及`finally`处理机制。(注:在JDK1.4.2之前的Javac编译器采用了jsr和ret指令实现`finally`语句。在JDK1.7中,已经完全禁止Class文件中出现jsr和ret指令,如果遇到这两条指令,虚拟机会在类加载的字节码校验阶段抛出异常)
2019-01-05 00:31:06
2396
4
原创 Java字节码结构剖析四:属性表
了解了方法表的结构后,我们知道方法表有自己的属性表,用来存储与当前方法相关的附加属性。属性表每一个成员的值必须是`attribute`结构(如下所示:),一个方法可以有任意个与之相关的属性。
2018-12-09 18:09:40
1578
转载 浅析java内存模型
在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步?在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。线程之间通过共享程序公共的状态,通过读-写内存中公共状态的方式来进行隐式的通信。同步指的是程序在控制多个线程之间执行程序的相对顺序的机制,在共...
2018-12-02 14:41:30
231
原创 Java字节码结构剖析三:方法表
这里给大家介绍一款字节码分析小工具——jclasslib bytecode viewer。它可以将字节码文件结构化的展现给我们看。
2018-11-18 16:44:58
2380
原创 Java字节码结构剖析二:字段表
上篇介绍了字节码文件的结构和其常量池分析。紧接其后呢,我们要去了解字段表的概念和组成结构。接着上篇里的字节码的常量池往后分析。access_flags访问标志信息包括该class文件是类还是接口,是否定义成public,是否是abstract,如果是类,是否被申明为final。access_flags 的取值范围和相应含义见下表。标记名值含义ACC_PUBLIC0...
2018-10-28 16:44:27
1095
原创 Java字节码结构剖析一:常量池
这篇博客开始,我打算手把手的带大家去解读一下JVM平台下的字节码文件(熟悉而又陌生的感觉)。众所周知,Class文件包含了我们定义的类或接口的信息。然后字节码又会被JVM加载到内存中,供JVM使用。那么,类信息到了字节码文件里,它们如何表示的,以及在字节码里是怎么分布的呢?带着这些问题,让我们去深入了解字节码文件吧。
2018-10-14 15:01:42
2595
原创 Java与单例模式
最近在阅读《Effective Java 》这本书,第3个条款专门提到了单例属性,并给出了使用单例的最佳实践建议。让我对这个单例模式(原本我以为是设计模式中最简单的一种)有了更深的认识。单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在应用这个模式时,单例对象的类必...
2018-07-29 20:49:47
9891
原创 策略模式
最近我在项目中做了一个地图API相关的功能开发,需求就是,国内调百度地图API,海外就调谷歌地图API。功能实现很简单,但是这个功能开发完后,让我对策略模式有了更深的理解和印象。在这里我把当时的想法和遇到的问题完整记录下来。首先,定义一个地图接口。/** * 地图service */public interface IMapService { /** *...
2018-06-16 15:45:32
311
原创 类初始化阶段详解
一个Java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况。如图所示: 类的初始化做了什么为类的静态变量赋予正确的初始值。执行类的静态代码块。按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句。什么时候类会被初始化只有类或接口...
2018-03-04 20:46:24
4586
7
原创 Java NIO学习笔记四(零拷贝详解)
维基上是这么描述零拷贝的:零拷贝描述的是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。
2018-01-21 20:20:57
30203
12
转载 Java NIO学习笔记三(堆外内存之 DirectByteBuffer 详解)
堆外内存堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存。那么堆外内存就是存在于JVM管控之外的一块内存区域,因此它是不受JVM的管控。
2017-12-11 17:13:24
18692
1
原创 foreach循环详解
不要在 foreach 循环里进行元素的 remove / add 操作。 remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁
2017-11-02 15:48:17
6002
转载 gradlew在基于Gradle项目构建中的应用分析
众所周知,在软件开发中,我们无论使用何种工具、库和软件,首先要做的事情就是先将所需的工具下载到本地,然后可能还需要进行一些基本的配置才能够正常使用。
2017-10-22 16:22:26
4519
1
原创 git用github搭建远程仓库
在github上新建远程库,然后和本地git库关联,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
2017-07-15 14:45:51
525
转载 MySQL数据库分区(Database partition)
数据库分区是一种物理数据库设计技术,DBA和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
2017-05-31 17:03:58
3325
原创 Lambda表达式和匿名内部类
初学lambda表达式的时候,以为lambda表达式就是对匿名内部类的一种简化写法,其他方面跟匿名内部类是一样的。这说的只是二者之间只存在简单的语法上的变化。但实际上,二者之间存在很多显著差异,其中有两点对于程序员来说非常重要:
2017-04-22 20:36:20
6192
原创 Java泛型对方法重载的影响(二)
虚拟机没有泛型类型对象——所有对象都属于普通类。在泛型实现的早期版本中,甚至能够将使用泛型的程序编译为在1.0虚拟机上运行的类文件!这个向后兼容性在Java泛型开发的后期被放弃了。无论何时定义一个泛型类型,都自动提供了一个相应的原始类型(raw type)。原始类型的名字就是删去类型参数后的泛型类型名。擦出(erased)类型变量,并替换为限定类型(无限定类型的变量用Object)。
2017-04-09 15:19:42
1384
1
原创 Java泛型对方法重载的影响(一)
java泛型是在编译期有效,在运行期被删除,也就是说所有的泛型参数类型在编译后都会被清除掉。因为虚拟机没有泛型类型对象——所有对象都属于普通类。
2017-04-09 14:47:13
10532
1
原创 sql查询员工请假详情——请假天数跨月问题
项目中要加个月签到详情页面。需求:就是用户选择月份,查询该月员工签到详情(包括请假)。数据库(mysql)中已有休假表(tt_offwork),表结构如下:CREATE TABLE `tt_offwork` ( `offwork_id` varchar(32) NOT NULL, `create_time` datetime DEFAULT NULL, `day_num` decimal
2017-03-09 11:33:25
7674
转载 2017年App开发趋势介绍详解(建议收藏)
2017 年的开年,朋友圈先被一圈小程序的新闻刷爆了。小程序未出之前,许多媒体声称这将颠覆App。可是小程序推出之后,媒体的声音不像之前那样一边倒了。App开发人员估计还要继续忙碌下去,因为整个App开发行业的创新依然保持着非常强劲的增长势头,而对于很多企业而言,移动营销策略也会显得愈发重要。身处在这个 ” 移动 ” 的时代,作为创业者的你是否也想从这个庞大的市场里分到一块蛋糕呢?
2017-01-21 11:41:35
2087
转载 MVC,MVP 和 MVVM 的图示
本文转自阮一峰的网络日志复杂的软件必须有清晰合理的架构,否则无法开发和维护。MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。昨天晚上,我读了《Scaling Isomorphic Javascript Code》,突然意识到,它们的区别非常简单。我用几段...
2016-10-15 15:26:55
535
原创 Kettle连接ORACLE失败,报错IO异常:
之前用kettle从测试环境抽数据,连接的是oracle数据库,没有任何问题。今天,经理让我从生产环境抽数,于是我把之前连接的主机名称改成生产环境的地址,换一下用户名密码,其它不变(如:数据库名称)。连接时报错如下图: 感到很纳闷,用户名和密码都是正确的,测试环境可以连,怎么换个IP就失败了。 通过检查,觉得应该是错在连接ORACLE的SID上。我觉得kettle连接ORALCE应该是
2016-06-30 13:38:07
6616
原创 为什么我们要尽可能使用Iterator接口中的remove方法而不是用Collection接口中的remove方法
最近在看《数据结构与算法分析》(Java语言描述)一书,看到第3.3.2 这一节时介绍Iterator接口。书中说道,“Iterator接口中包含一个方法,叫做remove()。该方法可以删除next最新返回的项。虽然Collection接口也包含一个remove方法,但是,使用Iterator的remove可能有更多的优点。” 那么首先我们知道Collection接口是继承于Iterator接口
2016-06-26 22:42:34
6648
原创 Java中ListIterator和Iterator详解与辨析
Java中ListIterator和Iterator详解与辨析在使用java集合的时候,都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢?下面我们详细分析。这里有一点需要明确的时候,迭代器指向的位置是元素之前的位置,如下图所示:这里假设集合List由四个
2016-06-18 17:33:43
632
原创 如何查看Oracle中同义词的表结构
select column_name, data_type, data_length from user_tab_cols@dblink t where t.table_name='表名';注: 1.@dblink是你要查询的同义词对应的database link。 2.表名是在db link里
2015-12-12 20:28:25
10493
PL/SQL Developer 11.0.4绿色破解版
2015-11-23
google-gson-2.2.4
2015-11-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人