ASM

JDK动态代理和 CGLIB 代理

六眼飞鱼酱① 提交于 2020-08-08 18:35:36
JDK动态代理和 CGLIB 代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期期间创建一个接口的实现类来完成对目标对象的代理。 代码示例 接口 public interface IUserDao { void save(); } 实现类 public class UserDao implements IUserDao { @Override public void save() { System.out.println("=====已经保存数据======="); } } 代理类 public class DynamicJdkProxy { /** * 维护一个目标对象 */ private Object target; public DynamicJdkProxy(Object target) { this.target = target; } /** * 给目标对象生成代理对象 * * @return */ public Object getProxyInstance() { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override

mac 上asm wasm js 性能对比

给你一囗甜甜゛ 提交于 2020-08-08 01:36:19
以js作为速度单位, 按照计算时间的比值 基于c的wasm 速度是js的2.3倍左右 asm的wasm速度是1.6左右 对比代码 const fs = require("fs"); const Module = require('./a.out') const loader = require("@assemblyscript/loader"); const imports = { /* imports go here */ }; const wasmModule = loader.instantiateSync(fs.readFileSync(__dirname + "/build/optimized.wasm"), imports); // const wasmModule = loader.instantiateSync("./build/optimized.wasm", imports); const fibAsm = wasmModule.exports.fibAsm; // fibWasm = Module.cwrap('fibWasm', 'number', ['number']); const fibJs = n => n < 2 ? n : fibJs(n - 1) + fibJs(n - 2) Module.onRuntimeInitialized = () =

Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件

怎甘沉沦 提交于 2020-08-07 02:57:50
Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件 前言 公司有购买的监控软件北塔系统监控,由于购买的版权中只包含了有限台数据库服务器的监控,所以只监控了比较重要的几台服务器。 后边出现过没有监控的数据库服务器表空间爆满导致生产业务出现问题,后续手工处理数据也麻烦。 因此领导让我想办法能用什么方法监控上目前没有监控的数据库。 当然,我想到的只有三种, OEM 13C,Oracle本家的产品,好处多多; 自己写脚本监控,比较锻炼人和实惠,功能比较单一; 第三方的监控软件,鉴于北塔在数据库方面的监控效果,本人不是看好第三方的 捣鼓了几天OEM 13C,最后公司暂时没有资源装新的OEM服务器,遂放弃。 自己写脚本吧。。 思路 我的思路是: (步骤1)每次检查的时候,截取警告日志中需要检查的内容到另外的日志文件中(比如new_alert.log); (步骤2)过滤该日志文件(new_alert.log)中存在的ORA报错信息,存放至另外的日志文件中(比如err_alert.log); (步骤3)将日志(err_alert.log)的报错内容发送至指定的邮箱中,达到报警的目的。 下边一步一步来写脚本解决吧。 步骤1 首先我用的shell,脚本的例行开头为: #!/bin/ bash source /home/oracle/.bash_profile 然后需要考虑几个问题,

简单使用java instrument包

蹲街弑〆低调 提交于 2020-08-06 20:36:02
解释: ClassFileTransformer接口,定义一个类文件转换器。接口中的transform()方法会在类文件被加载时调用,而在transform方法里,我们可以利用上文中的ASM或Javassist对传入的字节码进行改写或替换,生成新的字节码数组后返回。 在jar包前加 java -javaagent:{agent路径}/agent.jar -jar xxx.jar 例如我们想获取akka.http.scaladsl.server.RequestContextImpl类的这个属性request的默认值 项目结构: 代码: maven3.5.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zxing</groupId>

CGLIB(Code Generation Library) 简介

北城以北 提交于 2020-08-06 06:29:48
CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 一、什么是 CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib 二、CGLIB 原理 CGLIB 原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。 CGLIB 底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。 CGLIB缺点:对于final方法,无法进行代理。 三、CGLIB 的应用 广泛的被许多AOP的框架使用,例如Spring AOP和dynaop。Hibernate使用CGLIB来代理单端single

使用Istio进行多集群部署管理:单控制平面 Gateway 连接拓扑

只愿长相守 提交于 2020-08-06 04:12:37
作者 | 王夕宁 阿里巴巴高级技术专家 导读: 本文摘自于由阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实践》一书,讲述了如何使用 Istio 进行多集群部署管理来阐述服务网格对多云环境、多集群即混合部署的支持能力。 前文详情: 如何使用 Istio 进行多集群部署管理:单控制平面 VPN 连接拓扑 单控制平面拓扑下,多个 Kubernetes 集群共同使用在其中一个集群上运行的单个 Istio 控制平面。控制平面的 Pilot 管理本地和远程集群上的服务,并为所有集群配置 Envoy Sidecar 代理。 集群感知的服务路由 Istio 1.1 中引入了集群感知的服务路由能力,在单一控制平面拓扑配置下,使用 Istio 的 Split-horizon EDS(水平分割端点发现服务)功能可以通过其入口网关将服务请求路由到其他集群。基于请求源的位置,Istio 能够将请求路由到不同的端点。 在该配置中,从一个集群中的 Sidecar 代理到同一集群中的服务的请求仍然被转发到本地服务 IP。如果目标工作负载在其他集群中运行,则使用远程集群的网关 IP 来连接到该服务。 (集群感知的服务路由) 如图所示,主集群 cluster1 运行全套的 Istio 控制平面组件,同时集群 cluster2 仅运行 Istio Citadel、Sidecar Injector 和

原来Linux是这么管理内存的

穿精又带淫゛_ 提交于 2020-08-06 04:03:27
Linux 内存管理模型非常直接明了,因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux,下面我们就来认识一下 Linux 内存管理是如何实现的。 基本概念 每个 Linux 进程都会有地址空间,这些地址空间由三个段区域组成:text 段、data 段、stack 段。下面是进程地址空间的示例。 数据段(data segment) 包含了程序的变量、字符串、数组和其他数据的存储。数据段分为两部分,已经初始化的数据和尚未初始化的数据。其中尚未初始化的数据就是我们说的 BSS。数据段部分的初始化需要编译就期确定的常量以及程序启动就需要一个初始值的变量。所有 BSS 部分中的变量在加载后被初始化为 0 。 和 代码段(Text segment) 不一样,data segment 数据段可以改变。程序总是修改它的变量。而且,许多程序需要在执行时动态分配空间。Linux 允许数据段随着内存的分配和回收从而增大或者减小。为了分配内存,程序可以增加数据段的大小。在 C 语言中有一套标准库 malloc 经常用于分配内存。进程地址空间描述符包含动态分配的内存区域称为 堆(heap)。 第三部分段是 栈段(stack segment)。在大部分机器上,栈段会在虚拟内存地址顶部地址位置处,并向低位置处(向地址空间为 0 处)拓展。举个例子来说,在 32

动态获取方法参数的坑

穿精又带淫゛_ 提交于 2020-08-05 14:46:02
问题 问题的背景: 由于springcache并不是很好用,并不针对细粒度的过期时间控制。所以我司基于spel表达式写了一个缓存切面实现类似的功能。 但近期发现在使用过程中有产生缓存的时候key为null的情况。 问题的表现主要是发现有redis中有时候用户的redis缓存里面居然存在key后缀为null的缓存数据,但是值却有用户信息: 原因 经偶然间,发现突然复现了这个问题,于是开始深入debug,发现原来spring自带的ParameterNameDiscoverer(用于获取方法参数名的工具)解析方法参数名的时候是用ASM(一个字节码操作框架,Cglib就是用的这个)解析的class文件获取的参数名。在ParameterNameDiscoverer内部的方法中,发现解析的class输入流居然为null,为什么勒,于是猜测磁盘文件的class不存在了。于是重启项目,发现能够顺利获取参数名,执行mvn clean命令后就获取不到了。又由于在解析参数名的时候每次都new了LocalVariableTableParameterNameDiscoverer对象获取的,所以没有应用到其自带的缓存机制,导致该问题较频繁的出现。 在思考线上测试环境的问题,原来线上jenkens执行的脚本是先复制文件在kill进程。 解决方案 调整redis缓存切面

美颜背后的那些算法技术

心不动则不痛 提交于 2020-08-05 05:25:45
今天就直接从美颜的算法角度来做一些简单解读。美颜按功能需求来看可分为基础、高级和附加功能三大块。基础概念就是磨皮、处理肤色,目前即便是原生系统自带的相机美颜也能做到基础美颜功能的实时计算,所以启动相机取景预览时就能看到,目前直播用的美颜摄像头已经可以实现高级功能的即时演算,比如祛痘、瘦脸、增大眼睛、五官立体等…… 美颜功能的基本构架就是这样,接下来就来一点一点地聊聊美颜算法的细节,首当其冲的自然是最重要的基本功能:磨皮。从算法的角度来看,磨皮是用滤波器将痘印、胎记、伤痕等高频信息给滤除,再用光滑皮肤灯领域低频信息进行填充。在种类繁多的高频滤波器里,适用于人像修复的主要都是带通滤波器,比如双边滤波、导向滤波、灰度图像各向异性扩散等,因为它们的特色是可以保留边缘信息,在磨皮的同时不会像高斯滤波那样让整张照片都模糊掉。 双边滤波其实简单来说它是高斯滤波的衍生版,区别在于双边滤波在把像素空域距离纳入计算的同时,还考虑了像素值域之间差值的高斯系数,两个像素的值域差距越大,计算过程中的权重就越小,反之亦然,所以这个值域系数的作用就很关键。 对于完全从背景中抽离的人像来说,双边滤波磨皮很实用,但不足也比较明显,第一是一些面积较大的雀斑或胎记因为值域相差较大,就无法被磨皮操作简单平滑掉,很多时候就需要手动干预,在用户选取区域后以该区域中心为起点,选取一个包含但大于整个选取面积的矩形窗口并计算均值

设备树(device tree)学习笔记

旧街凉风 提交于 2020-08-05 04:57:04
1、反编译设备树 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助。这里我们需要使用设备树生成工具dtc的反编译功能 root@pengdl-VirtualBox:~/tq2440/Linux/linux-4.0.1# ./scripts/dtc/dtc -h Usage: dtc [options] <input file> Options: -[qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv] -q, --quiet Quiet: -q suppress warnings, -qq errors, -qqq all -I, --in-format <arg> Input formats are: dts - device tree source text dtb - device tree blob fs - /proc/device-tree style directory -o, --out <arg> Output file -O, --out-format <arg> Output formats are: dts - device tree source text dtb - device tree blob asm - assembler source -V, --out-version <arg>