某个文件夹下面有n个文件,需要移动大于10M的文件到/tmp/目录下
实现命令
1 | find . -type f -size +100M -exec mv {} /tmp/ \; |
find 查找
. 当前目录
-type 文件类型:f 文件,d 目录
-size 文件大小:+100M +:大于 -:小于 空:等于
-exec 管道命令,将前面的查询结果传递给后面的命令
{} 指前面传递过来的的查询结果
; 结束管道命令
某个文件夹下面有n个文件,需要移动大于10M的文件到/tmp/目录下
实现命令
1 | find . -type f -size +100M -exec mv {} /tmp/ \; |
find 查找
. 当前目录
-type 文件类型:f 文件,d 目录
-size 文件大小:+100M +:大于 -:小于 空:等于
-exec 管道命令,将前面的查询结果传递给后面的命令
{} 指前面传递过来的的查询结果
; 结束管道命令
这里讲述的是第一次出生的过程,即之前class没有被加载。
1.1.1.1 通过类的全限定名获取定义此类的二进制字节流(可以从zip包、网络、运行时动态生成);
1.1.1.2 将这个字节流所代表的静态存储结构转化为方法去运行时数据结构;
1.1.1.3 在内存(方法区)中生成一个代表这个类的java.lang.Class对象,作为方法区这个类各种数据访问的入口;
1.1.2.1.1 魔数是否以0xCAFEEBABE开头(咖啡宝贝)
1.1.2.1.2 主、次版本号是否在当前虚拟机处理的范围之内(不同的jdk版本编译出来的版本不一致,可向前兼容)
1.1.2.1.3 常量池是否有不被支持的类型(检查常量tag标志)
1.1.2.1.4 指向常量的各种索引值是否指向不存在或者不符合类型的常量
1.1.2.1.5 CONSTANT_Utf8_info型的常量中是否有不符合UTF-8编码的数据
1.1.2.1.6 Class文件中各个部分以及文件本身是否有被删除或者附加的其它信息
…
这些操作是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身安全
1.1.2.2.1 是否有父类(Object除外)
1.1.2.2.2 是否继续了不允许继承的类(被final修饰的)
1.1.2.2.3 如果当前不是抽象类,是否实现了其父类或接口中要求实现的所有方法
1.1.2.2.4 类中的字段、方法是否与父类产生矛盾(如覆盖父类final字段、不合法的重载)
这些操作是对字节码进行语义分析,确保符合Java语言规范要求
1.1.2.3.1 确保操作数栈的数据类型与指令代码序列能完美配合(反例:操作数栈为int,使用的时候按long加载)
1.1.2.3.2 确保跳转指令不会跳转到方法体以外的字节码指令上
1.1.2.3.3 确保方法体重点类型转换是有效的
这些操作主要是通过数据流和控制流分析,确定程序的语义是合法的、符合逻辑的。
JDK1.6之后有一个优化,利用StackMapTable来验证是否合法
1.1.2.4.1 符号引用中通过字符串描述的全限定名是否能找到对应的类
1.1.2.4.2 符号引用中的类、字段、方法是否可以被当前类访问
在将符号引用转化为直接引用的时候触发符号引用验证
举个例子:快到吃饭的点了,你有两种选择:1)自己做,2)叫外卖
1.1.1 自己做你嫌麻烦,那就叫外卖,只管收外卖其它不关注(解耦);
1.1.2 自己做的不好吃,那厨师上门,厨师给你增强菜的味道(增强);
官方定义:对其他对象提供一种代理以控制对这个对象的访问。
1.2.1 设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。
1.2.2 我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。
1.2.3 Spring的AOP机制就是采用动态代理的机制来实现切面编程。
2.1.1 JDK:只能代理接口
2.1.2 CGlib:直接代理类
今天中午一个朋友问我一个问题没来得及回,现在折腾一下;
问题:有一个包含以N个空格分割的字符串,求最大子串的长度,要求时间空间复杂度最优;
封装的代码比较复杂,目前来看不在么好分析时间复杂度和空间复杂度;
于是就直观得对比了一下时间;
1 | // output |
有时间再深入了解下StringTokenizer的源码
1 | String oriStr = "aa aa aaaa aaa a a a aa aa a"; |
近几年一直在使用dubbo进行支付系统的开发;
作为国内比较受欢迎的一个SOA框架,Dubbo使用简单设计优雅;
里面用到的思想和技术,基本上涵盖大部分互联网公司用到的技术;
记得直属领导说过一句话,看完Dubbo他觉得设计者简直就是天才;
而且看完dubbo的源码,对他的影响很大,处处模仿dubbo的思想;
中文文档:用户文档、开发者指南、源码导读、运维管理
http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
用户手册(比较完整):
https://dubbo.gitbooks.io/dubbo-user-book/demos/routing-rule.html
官方博客:
http://dubbo.apache.org/zh-cn/blog/index.html
最后更新于2014年
https://javatar.iteye.com/
权重算法一般在路由里面用的比较多,分布式环境下对等的服务有多个,加权随机选出一个服务来调用;
可能还有其他方面的用途,下面的代码简单的实现了这个权重,本质上就用到了数组,随机下标;
1 | public static void main(String[] args) { |
有时候上线会出现合错代码,比如功能,或者maven的pom文件;
人都不是十全十美的人,只要是人就会犯错
关键是要想办法去避免,只有工具才不犯错
所以尽量想办法利用工具来防止我们犯错,git来说有很多办法;
简单的命令,或者gitlab的compare报告;
每次上线之前,开发自己看一遍当前版本与线上版本的区别,确认每一个点都是正确的改动;
2.1 入口:工程首页 -> Repository -> Compare
2.2 选择:上一个版本,当前版本,点击Compare
2.2 结果:一次能看到两个版本的所有commit、改动点
1 | # 显示版本之间改动的文件名 |
1 | com.alibaba.dubbo.remoting.transport.ExceedPayloadLimitException: Data length too large: 14277263, max payload: 8388608, channel: NettyChannel [channel=[id: 0x12a13c8f, /172.0.0.1:49402 => /172.0.0.2:23888]] |
dubbo默认使用Netty传输协议
并且默认的大小限制为:默认为8M,即8388608
修改接口
出现这种情况是因为一个接口查某个表的所有数据(几万条)
一般这种接口肯定是需要分页的
更改配置信息
在dubbo.properties 中增加如下
1 | dubbo.protocol.dubbo.payload=11557050 |
maven项目昨天遇到的一个错误:java.lang.NoClassDefFoundError
理论原因:JVM在编译的时候能找到调用方法或静态变量所在的类,但在运行的时候找不到此类而引发的错误。
真实原因:(仅针对当前问题)
项目A依赖公共服务C-1.0.1版本
项目B依赖项目A,B中dependencyManagement强制指定C-1.0.0
此时编译可以通过,运行时如果有用的C的新版本功能就会会出现上述问题
解决办法:对项目B中C的版本升级,使用1.0.1
扩展阅读:
https://blog.csdn.net/qq_27576335/article/details/77102385
https://blog.csdn.net/jamesjxin/article/details/46606307