自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

沧海一粟

More know, more less

  • 博客(121)
  • 资源 (5)
  • 收藏
  • 关注

原创 JVM源码研读:章节序列

Java 虚拟机基础JVM源码系列:JVM内部运行之Class的Method Java (JDK7)中的String常量和String.intern的实现 JVM源码系列:ThreadMXBean 打出堆栈信息原理分析 JVM源码系列:使用PrintAssembly打印java运行过程中的汇编 JVM源码系列:java如何实现多态性,基于itable, vtable源码分析 JVM源...

2018-11-09 09:16:59 3725 1

原创 Spark 2.1.0 大数据平台源码分析:章节序列

Spark 2.1.0 大数据平台源码分析:章节序列

2017-07-27 07:13:57 3963 1

原创 静态代码分析-概念:敏感性

静态代码分析-概念:敏感性

2022-05-06 14:33:38 680

原创 JVM C1 编译优化:空检查擦除

1. 什么是空检查在Java里经常会判断一个对象是否为空,如果为空的对象访问方法,字段会抛出空指针异常,而空指针异常为运行异常,如果不抓取这个异常,有的时候会导致程序异常,为了解决这个问题,我们通常会在代码里显式的去判断该对象是否为空,进行为空的逻辑处理,这种做法逻辑虽然明确,但是由于空的逻辑并不是经常碰到,这样会导致有多余的逻辑分支判断。2. 隐式空检查 implicit exception我们先来看一个代码:public static int nullCheck(String valu

2020-10-19 18:52:43 4284

原创 JVM C1 编译优化:合并相同的表达式-Global Value Numbering 之实现

1. 原因为了合并相同的运算,避免重复计算,通常在编译过程中,编译器会尝试合并相同的计算。C1在初始的时候内部会构建图结构的HIR,它由基本块BB构成一个控制流图,每个基本块里面是SSA形式的指令。单个BB块中通过ValueNumbering 来实现,多个BB块里实现的合并叫做Global Value Numbering ,但其算法的本质是一致的。2. 值编号 Value Numbering值编号(Value numbering):是指为每个SSA的instruction计算一个Hash

2020-09-25 16:36:07 944 1

原创 Soot 静态分析框架(七)模块分析

Java 9里开始支持模块化,以一个独立的开源项目jigsaw而来, 具体可以参考链接,https://openjdk.java.net/projects/jigsaw/ 同时也可以参考JSR376标准1. module-info 分析在模块化的时候,需要构建module_info.java来声明模块之间的关系,在Module声明里面定义了requires ,exports...

2020-01-15 17:29:29 1936

原创 Soot 静态分析框架(六)数据流指向分析

1. 数据流指向分析1.1 指向分析指向分析,给定一个变量的函数,计算其可能的类型,指向信息,指向分析可以帮助其它的分析。1.2 Soot的指向分析框架soot提供了PointsToAnalysis ,PointsToSet接口。任何一个指向的分析都应该实现这两个接口。PointsToAnalysis 方法reachingObjects(Local l),该方法可以返回指向参...

2019-10-19 10:00:03 3051

原创 Soot 静态分析框架(五)Annotation 的实现

1. Annotation的实现1.1 Java实现的Annotationjava 的自定义注解实现,通常我们会先自定义一个注解 import java.lang.annotation.ElementType; import java.lang.annotation.*; @Target({ElementType.TYPE,ElementType.FI...

2019-10-19 09:06:53 1051

原创 soot 静态分析框架(四)Soot lambda 构建

1. JVM 的 Lambda构建和JVM构建Lambda的方式不同,因为Lambda表达式的类是一个运行的时候动态生成的类,是通过新的JVM的指令集InvokeDynamic来实现,通过调用java/lang/invoke/LambdaMetafactory.metafactory去生成动态的内部Class,在Class里面封装了实现的抽象方法,在抽象方法里实现了对源类的静态方法packag...

2019-10-19 08:54:39 957

原创 Soot 静态分析框架(三)Soot 过程分析

3.1Soot构建语法树Soot通过objectweb来进行字节码构建成语法树首先scene会去查找一些基础的JVM的类基础的对象Object, Boolean, Void, Integer, Long, Float等 字符串操作:String, StringBuffer的类 Exception, Throwable,以及一些常见的Error类 线程相关的, Thre...

2019-09-26 15:30:38 7243

原创 Soot 静态分析框架(二)Soot的核心

2. Soot核心BodyBody 是对应的是Java一个函数体,Body是Soot的核心,Graph、Flow的构建都是基于Body进行分析,当然你可以基于不同的IR语言构建不同的Body,soot提供了JimpleBody,ShimpleBody, GrimpBody,当然soot主要是基于Jimple进行分析,在流程中构建的是JimpleBody,其它的Body的构建需要通过开关来控制...

2019-09-26 15:18:34 3037 3

原创 Soot 静态分析框架(一)整体框架

1. Soot 静态分析框架Soot核心对象分别是:Scene、SootClass、SootMethod、SootField、Body。1.1 SceneScene:Scene表示完整的分析环境,可以通过Scene.v()调用设置Options的API,也可以获取一些过程间分析的信息,如call graphs, points-to informati...

2019-09-26 15:10:47 4781 1

原创 用Bert模型计算句子的vector

1. Bert模型Bert模型是2018年google开源出来的NLP的模型,具体实现请参考:https://github.com/google-research/bert2. Bert模型计算句子的vector2.1 通过模型获取句子的encoder层 model = modeling.BertModel( config=bert_config, ...

2019-07-21 17:57:24 3082

原创 从如何在Java删除乱码文件中开始说起

1. 乱码文件为何会生成乱码文件?原因很多,在上传的过程中编码不对,操作提供不支持该编码等,如果你尝试用Java的File对象去删除文件,甚至判断是否存在该文件都会发现返回的都是FalseString[]entries = file.list(); for(String s: entries){ File currentFile = new File(file.getPa...

2019-03-13 16:17:06 978

原创 文本相似度算法之编辑距离算法

定义编辑距离又称Leveinshtein距离,是由俄罗斯科学家Vladimir Levenshtein在1965年提出。以字符串为例,字符串a和字符串b的编辑距离是将a转换成b的最小操作次数,这里的操作包括三种:插入一个字符删除一个字符替换一个字符举个例子,计算learning和meaning的编辑距离,需要下列步骤learning -> mearning 将k替换成s...

2019-03-13 08:42:59 1900

原创 【TensorFlow基础函数】tf.concat的用法

tf.concat 的用法TF官方的文档tf.concat( values, axis, name='concat')连接多个Tensor的操作values 多个Tensoraxis是哪个纬度0 代表第一纬度1 代表第二纬度2 代表第三纬度n 代表第n+1纬度案例: t1 = [[[1, 2, 3], [4, 5, 6]],[[7, 8, 9...

2019-02-25 21:44:31 2199

原创 JVM源码系列:JVM内部运行之Class的Method

1. Class的属性在JVM中,通常一个class会初始化成Klass(接口), InstanceKlass(实例), Method(方法), ConstantsPool(常量区)在上图我们可以看到一个大概的Method,ConstantsPool,InstanceKlass之间的关系InstanceKlass 里面保存着ConstantPool指针Method指针的数组 Me...

2018-11-08 19:55:37 2719

原创 Tensorflow 源码分析-  从GPU OOM开始说Tensorflow的BFC内存管理

前言在平台上跑GPU训练,结果CUDA OOM了,错误提示E Internal: failed initializing StreamExecutor for CUDA device ordinal 0: Internal: failed call to cuDevicePrimaryCtxRetain: CUDA_ERROR_OUT_OF_MEMORY; total memory repor...

2018-05-04 11:46:13 8318 1

原创 Tensorflow 源码分析-会话与线程池之间的关系

1. Tensorflow 的sessionFactory创建新的会话,tensorflow使用了多工厂模式,在不同的场景下使用不同的工厂, 使用什么工厂模式由传递进来的SessionOptions来决定。1.1 注册工厂Tensorflow 提供了可以注册多会话工厂的模式,允许不同的模块注册自己的会话工厂void SessionFactory::Register(const string&amp...

2018-04-02 17:11:16 4070

原创 【TensorFlow基础函数】tf.transpose函数说明和用法

tf.transpose 函数官网介绍https://www.tensorflow.org/api_docs/python/tf/transposetf.transpose( a, perm=None, name='transpose', conjugate=False)函数说明:依据指定perm交换输入张量的不同维度参数perm: ...

2018-01-23 14:58:12 1241

原创 Tensorflow 源码分析-GPU调用是如何实现的

1. Tensorflow GPU支持Tensorflow 支持GPU进行运算,目前官方版本只支持NVIDIA的GPU,可以在tensorflow的官方上看到。Tensorflow 对GPU的运算的支持最小力度就是OP,也就是我们常说的算子,下图提供了Tensorflow的一些常见算子,而每个算子在Tensorflow上都会提供GPU的算法:关于OP的具体实现,在本篇博客中就不叙述了。2. Ten...

2017-12-21 10:22:30 9179 1

原创 案例分享:如何通过JVM crash 的日志和core dump定位和分析Instrument引起的JVM crash

1. JVM crash了产品发来一份crash report, 什么是crash report请参考我的前期博客(http://blog.csdn.net/raintungli/article/details/7642575),下面是截取了crash report的部分,用于分析:# Problematic frame:# V [libjvm.so+0x5bbf05] instanceKl

2017-09-02 11:04:12 9861 2

原创 深度学习:神经网络中的前向传播和反向传播算法推导

1. 神经网络这是一个常见的神经网络的图:这是一个常见的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层

2017-08-08 16:53:27 44655 16

原创 大数据:Spark mlib(三) GradientDescent梯度下降算法之Spark实现

1. 什么是梯度下降?梯度下降法(英语:Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。先来看两个函数:1.  拟合函数:θ" role="presentation" style="display: inline; line-he

2017-07-10 15:24:34 4023

原创 大数据:Spark 算子(一)排序算子sortByKey来看大数据平台下如何做排序

1 前言在前面一系列博客中,特别在Shuffle博客系列中,曾今描述过在生成ShuffleWrite的文件的时候,对每个partition会先进行排序并spill到文件中,最后合并成ShuffleWrite的文件,也就是每个Partition里的内容已经进行了排序,在最后的action操作的时候需要对每个executor生成的shuffle文件相同的Partition进行合并,完成Action的操

2017-06-26 16:42:13 8870

原创 大数据:Spark mlib(二) Naive bayes朴素贝叶斯分类之多元朴素贝叶斯源码分析

1. 什么是朴素贝叶斯朴素贝叶斯是一种构建分类器,该分类器基于一个理论:所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关2. 朴素贝叶斯概率模型概率模型分类器是一个条件概率模型:(独立的类别特征C有若干类别,条件依赖于若干特征变量F1,F2,...,Fn)      贝叶斯定理:  我们可以看到分母并不依赖于C,而且特征Fn的概率是给定的,分母可以认为是一个常数。这样分子就等价于联合分布模

2017-06-23 14:36:26 3096

原创 大数据:Spark mlib(一) KMeans聚类算法源码分析

1. 聚类1.1 什么是聚类?所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用算法将集合D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高,其中每个子集叫做一个簇。1.2 KMeans 聚类算法K-Means聚类算法主要分为如下几个步骤:从D中随机取k个元素,作为k个簇的各自的中心分别计算剩下的元素到k个簇中心的相异度,将这些元素分

2017-06-09 12:22:17 6469

原创 大数据:Spark Shuffle(三)Executor是如何fetch shuffle的数据文件

1. 前言在前面的博客中讨论了Executor, Driver之间如何汇报Executor生成的Shuffle的数据文件,以及Executor获取到Shuffle的数据文件的分布,那么Executor是如何获取到Shuffle的数据文件进行Action的算子的计算呢?在ResultTask中,Executor通过MapOutPutTracker向Driver获取了ShuffID的Shuffle数据

2017-05-09 17:13:48 4409 4

原创 大数据:Spark Shuffle(二)Executor、Driver之间Shuffle结果消息传递、追踪

1. 前言在博客里介绍了ShuffleWrite关于shuffleMapTask如何运行,输出Shuffle结果到文件Shuffle_shuffleId_mapId_reduceId.data文件中,每个executor需要向Driver汇报当前节点的Shuffle结果状态,Driver保存结果信息进行下个Task的调度。2. StatusUpdate消息当Executor运行完Task的时候需要

2017-05-03 15:07:08 4364 1

原创 大数据:Spark Shuffle(一)ShuffleWrite:Executor如何将Shuffle的结果进行归并写到数据文件中去

1. 前序关于Executor如何运行算子,请参考前面博文:大数据:Spark Core(四)用LogQuery的例子来说明Executor是如何运算RDD的算子,当Executor进行reduce运算的时候,生成运算结果的临时Shuffle,并保存在磁盘中,被最后的Action算子调用,而这个阶段就是在ShuffleMapTask里执行的。

2017-04-27 11:44:32 7416 1

原创 大数据:Spark Core(四)用LogQuery的例子来说明Executor是如何运算RDD的算子

1. 究竟是怎么运行的?很多的博客里大量的讲了什么是RDD, Dependency, Shuffle... 但是究竟那些Executor是怎么运行你提交的代码段的?下面是一个日志分析的例子,来自Spark的example def main(args: Array[String]) { val sparkConf = new SparkConf().setAppName("Log Quer

2017-04-22 23:15:19 3383

原创 大数据:Spark Core(三)Executor上是如何launch task

1. 启动任务在前面一篇博客中(http://blog.csdn.net/raintungli/article/details/70168241#t9)介绍了Driver是如何调动、启动任务的,Driver向Executor发送了LaunchTask的消息,Executor接收到了LaunchTask的消息后,进行了任务的启动,在CoarseGrainedExecutorBackend.scala

2017-04-19 17:48:23 4272 1

原创 大数据:Spark Core(二)Driver上的Task的生成、分配、调度

1. 什么是Task?在前面的章节里描述过几个角色,Driver(Client),Master,Worker(Executor),Driver会提交Application到Master进行Worker上的Executor上的调度,显然这些都不是Task.Spark上的几个关系可以这样理解:Application: Application是Driver在构建SparkContent的上下文的时候创建的,就像申报员,现在要构建一个能完成任务的集群,需要申报的是这次需要多少个Executor(可以简单理解

2017-04-14 09:21:46 10636

原创 大数据:Spark Core (一) 什么是RDD的Transformation和Actions以及Dependency?

Spark的RDDRDD(Resilient Distributed Datasets),弹性分布式数据集,是对分布式数据集的一种抽象。RDD所具备5个主要特性:一组分区计算每一个数据分片的函数RDD上的一组依赖对于Key Value 对的RDD,会有一个Partitioner, 这是数据的分割器一组Preferred Location信息上图是一个简单的CoGroupedRDD满足了RDD 5个

2017-04-07 17:21:36 3610

原创 大数据:Spark Standalone 集群调度(三)多Master节点的可用性

1. Master 单节点可用性Master节点在Spark中所承载的作用是分配Application到Worker节点,维护Worker节点,Driver,Application的状态。在Spark中,Master本身也提供了基于硬盘的单节点的可用性,也就是可以直接通过重启Master,Master通过读取硬盘里保存的状态,进行单节点的恢复。

2017-04-01 09:37:53 9725

原创 大数据:Spark Standalone 集群调度(二)如何创建、分配Executors的资源

Standalone 的整体架构在Spark集群中的3个角色Client, Master, Worker, 下面的图是Client Submit 一个任务的流程图:完整的流程:Driver 提交任务给Master, 由Master节点根据任务的参数对进行Worker的Executor的分配,Worker节点获取到具体的分配信息启动executor 的子进程Master分

2017-03-29 17:37:33 4996 5

原创 大数据:Spark Storage(二) 集群下的broadcast

Spark BroadCastBroadcast 简单来说就是将数据从一个节点复制到其他各个节点,常见用于数据复制到节点本地用于计算,在前面一章中讨论过Storage模块中BlockManager,Block既可以保存在内存中,也可以保存在磁盘中,当Executor节点本地没有数据,通过Driver去获取数据Spark的官方描述:A broadcast variable. Broadc

2017-03-21 17:28:21 4378

原创 大数据:Spark Storage(一) 集群下的区块管理

Storage模块在Spark中提及最多的是RDD,而RDD所交互的数据是通过Storage来实现和管理Storage模块整体架构1. 存储层在Spark里,单机storage的管理是通过block来管理的,用每个块的存储可以在内存里或者在磁盘中,在BlockManager里既可以管理内存的存储,同时也管理硬盘的存储,存储的标识是通过块的ID来区分的。

2017-03-21 09:26:48 5987 1

原创 大数据:Spark Standalone 集群调度(一)从远程调试开始说application创建

远程debug,特别是在集群方式时候,会很方便了解代码的运行方式,这也是码农比较喜欢的方式虽然scala的语法和java不一样,但是scala是运行在JVM虚拟机上的,也就是scala最后编译成字节码运行在JVM上,那么远程调试方式就是JVM调试方式在服务器端:-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=7001

2017-03-09 17:41:55 5107

原创 Struts2远程命令执行漏洞 S2-045 源码分析

Struts2 又爆OGNL的高危漏洞S-045,又是OGNL的漏洞漏洞分析1. Struts 的上传request在上传文件里,Struts默认使用的是common upload 的上传组件, 为了能被action访问到上传的文件,通常会重新封装request,  Spring也是这么做。JakartaStreamMultiPartRequest.java中 public void parse(...

2017-03-08 02:04:34 9221 3

jdk1.6.23 libsaproc.so linux 下amd64架构

详细请看: Java 工具(jmap,jstack)在linux上的源码分析(五) -F 参数的bug的解决lib (http://blog.csdn.net/raintungli/article/details/7245709) 自己编译的,测试能够通过

2012-02-15

Linux C 编程一站式学习

介绍在linux上c程序开发 适合入门学习

2011-03-28

google 搜索引擎介绍

介绍了近几年的 google 搜索发展 与 改变,其中涉及到google 的最新的架构和思想。

2009-04-22

开源技术选型手册 web2.0 for java

最新的比较流行的开源软件使用手册,web 2.0全面介绍

2009-04-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除