Entry

flink BroadcastStream

与世无争的帅哥 提交于 2020-07-27 12:58:48
使用场景: 在处理数据的时候,有些配置是要实时动态改变的,比如说我要过滤一些关键字,这些关键字呢是在MYSQL里随时配置修改的,那我们在高吞吐计算的Function中动态查询配置文件有可能使整个计算阻塞,甚至任务停止。 广播流可以通过查询配置文件,广播到某个 operator 的所有并发实例中,然后与另一条流数据连接进行计算。 实现步骤: 1、定义一个MapStateDescriptor来描述我们要广播的数据的格式 final MapStateDescriptor<String, String> CONFIG_DESCRIPTOR = new MapStateDescriptor<>( "wordsConfig", BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.STRING_TYPE_INFO); 2、需要一个Stream来广播下游的operator 我这里实现了一个只有1个并发度的数据源,定时查配置文件,发动到下游 public class MinuteBroadcastSource extends RichParallelSourceFunction<String> { private volatile boolean isRun; private volatile int lastUpdateMin = -1; private

[A*算法]基于Unity实现A*算法(二)

随声附和 提交于 2020-07-27 11:05:35
写在前面:上一篇当时是非常简单的了解一下A*,昨天还有一些问题没解决,就暂时把自己查阅的文坛摘抄了过来(毕竟人家写的比我要好的多 :> ) 今天终于解决了,就又写了这一篇,正好我自己再梳理一遍,把Unity的实现也记录一下(Unity版本:2019.3.7.f1) ==================================================================================== 一、Unity UI表现实现   UI制作很简单,如下图    Canvas          UGUI画布(参考官网文档)     我这边主要是在上面挂载一个寻路脚本CSPathFindManager_AStar.CS   2.Panel          这里我用的是UGUI创建的Panel,主要是用来生成寻路点,挂载生成脚本CopyManager.CS   3.Node          UGUI创建的Image,用的纯色,用来充当路径点,挂载路径点脚本CSNode.CS   4.F/G/H/Pos/Index          UGUI创建的Text,通过修改文件对齐方式,使他们的文字分别位于Node的上下左右和中间,用来方便显示相关的值 二、Unity UI显示代码 1 using System; 2 using System

大牛聊Java并发编程原理之 线程的互斥与协作机制

↘锁芯ラ 提交于 2020-07-27 10:10:28
可能在synchronized关键字的实现原理中,你已经知道了它的底层是使用Monitor的相关指令来实现的,但是还不清楚Monitor的具体细节。本文将让你彻底Monitor的底层实现原理。 管程 一个管程可以被认为是一个带有特殊房间的建筑,这个特殊房间只能被一个线程占用。这个房间包含很多数据和代码。 如果一个线程要占用特殊房间(也就是红色区域),那么首先它必须在Hallway中等待。调度器基于某些规则(例如先进先出)从Hallway中取一个线程。如果线程在Hallway由于某些原因被挂起,它将会被送往等待房间(也就是蓝色区域),在一段时间后被调度到特殊房间中。 简而言之,监视器是一种监视现场访问特殊房间的设备。他能够使有且仅有一个线程访问的受保护的代码和数据。 Monitor 在Java虚拟机中,每一个对象和类都与一个监视器相关联。为了实现监视器的互斥功能,锁(有时候也称为互斥体)与每一个对象和类关联。在操作系统书中,这叫做信号量,互斥锁也被称为二元信号量。 如果一个线程拥有某些数据上的锁,其他线程想要获得锁只能等到这个线程释放锁。如果我们在进行多线程编程时总是需要编写一个信号量,那就不太方便了。幸运的是,我们不需要这样做,因为JVM会自动为我们做这件事。 为了声明一个同步区域(这里意味着数据不可能被超过一个线程访问)

多线程与高并发四:VarHandle与强软弱虚引用和ThreadLocal

空扰寡人 提交于 2020-07-27 09:00:27
文章目录 1:VarHandle 2:强软弱虚引用 2.1. 强引用 2.2. 软引用(SoftReference) 2.3. 弱引用(WeakReference) 2.4. 虚引用(PhantomReference):管理堆外内存 3:ThreadLocal 3.1:线程本地 3.2:原理 3.3:ThreadLocal与:弱引用的配合使用 1:VarHandle 上一篇说了AQS的源码,其中还有一个知识点VarHandle,看下面的代码 大家会问:VarHandle是什么?有什么作用? 其实: VarHandle是jdk1.9之后才出现的,表示指向某个变量的引用,可以完成原子性的线程安全操作可以通过cas方式进行比较设值。比反射快,直接操纵二进制码,反射每次操作前都要做检查 2:强软弱虚引用 博客部分内容引用: http://blog.csdn.net/liuxian13183 2.1. 强引用 Object object=new Object();那object就是一个强引用了。如果一个对象具有 强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题 。 2.2. 软引用(SoftReference) 如果一个对象只具有*

深入理解系统调用

十年热恋 提交于 2020-07-27 05:32:13
实验内容: 找一个系统调用,系统调用号为学号最后 2位相同的系统调用【即 97号系统调用】 通过汇编指令触发该系统调用 通过 gdb 跟踪该系统调用的内核处理过程 重点阅读分析系统调用入口的保存现场、恢复现场和系统调用返回,以及重点关注系统调用过程中内核堆栈状态的变化 实验环境: VMWare虚拟机下的Ubuntu18.04.4,实验采用的内核版本为linux-5.4.34。 1 环境准备 1.1 内核编译 回退实验一的补丁操作: cd linux-5.4.34 patch -R -p1 < ../mykernel-2.0_for_linux-5.4.34.patch make defconfig 修改内核编译配置重新编译: #打开debug相关选项 Kernel hacking ---> Compile-time checks and compiler options ---> [*] Compile the kernel with debug info [*] Provide GDB scripts for kernel debugging [*] Kernel debugging #关闭KASLR,否则断点失败 Processor type and features ---> [] Randomize the address of the kernel image

基于Spring Boot实现Mybatis的多数据源切换和动态数据源加载

生来就可爱ヽ(ⅴ<●) 提交于 2020-07-27 05:11:51
环境依赖:   Spring Boot:1.5.9   JDK:1.8.0   MySQL:5.7.17   Mybatis:3.3.0     本文主要就mybatis的多数据源切换和动态数据源加载的实现原理做分享;对于mybatis的基础可自行百度。由于在开始学习的时候,发现网上有很多人把多数据源切换和动态数据源加载混为一谈,导致在实现动态加载的时候,所很苦恼。所以有必要在这里做以简要说明:   多数据源切换:指项目所需要不止一个数据库的连接信息,eg:同一数据库地址下的不同库或者压根连地址都不同。   动态加载:指所需要的数据所在的数据库信息在项目启动前并不知道,只有在项目运行后根据业务逻辑获取到对应的数据库信息,并在代码的运行过程中,向Spring Boot中添加一个或多个mybatis实例。    单一数据源的连接   顾名思义,在项目中,在项目中只需要配置一个数据库的信息即可,业务所需要的所有数据均在这一个数据库下;这种场景通常能够适用于绝大部分的实际需求,因此这种实现的原理再次不做赘述,如有需求可自行百度。具体实现可参考源码spring-boot-mybatis-demo。 多数据源切换   业务场景:需要分别获取所有的用户信息和学生信息;但是已知用户信息在mybatis_demo数据库中,学生信息在mybatis_demo2 数据库中。如下图所示:

JVM源码分析之Attach机制实现完全解读

回眸只為那壹抹淺笑 提交于 2020-07-27 04:32:40
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 Attach是什么 在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地方,想知道卡在哪里,首先想到的是进行线程dump,而常用的命令是jstack ,我们就可以看到如下线程栈了 大家是否注意过上面圈起来的两个线程,”Attach Listener”和“Signal Dispatcher”,这两个线程是我们这次要讲的Attach机制的关键,先偷偷告诉各位,其实Attach Listener这个线程在jvm起来的时候可能并没有的,后面会细说。 那Attach机制是什么?说简单点就是jvm提供一种jvm进程间通信的能力,能让一个进程传命令给另外一个进程,并让它执行内部的一些操作,比如说我们为了让另外一个jvm进程把线程dump出来,那么我们跑了一个jstack的进程,然后传了个pid的参数,告诉它要哪个进程进行线程dump,既然是两个进程,那肯定涉及到进程间通信,以及传输协议的定义,比如要执行什么操作,传了什么参数等 Attach能做些什么 总结起来说,比如内存dump,线程dump,类信息统计(比如加载的类及大小以及实例个数等),动态加载agent(使用过btrace的应该不陌生),动态设置vm flag(但是并不是所有的flag都可以设置的,因为有些flag是在jvm启动过程中使用的,是一次性的)

@Java知识点--ImmutableMap

橙三吉。 提交于 2020-07-27 04:11:09
immutable [ɪˈmjuːtəbl] adj. 不变的;不可变的;不能变的 Java中的Immutable对象:简单地说,如果一个对象实例不能被更改就是一个Immutable的对象,Java SDK提供的大量值对象,比如String等都是Immutable的对象。 创建ImmutableMap Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build(); 在创建时放值 Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>() .put("k1","v1") .put("k2","v2") .build(); 创建后不可变 immutableMap.put("k1","v3");//会抛出java.lang.UnsupportedOperationException ImmutableMap中key和value均不能为null,放入null值会抛出NPE ImmutableMap的使用场景 1.适合 确定性的配置, 比如根据不同的key值得到不同的请求url 写单元测试 2.不适合 key, value为未知参数, 可能有null产生的情况 3.优化大量的if else

世界顶级选手的刷题之道

試著忘記壹切 提交于 2020-07-27 04:07:23
dreamoon,知名中国台湾籍ACM选手,此为他的codeforces曲线: 关于中间突降的那段,还有个小故事: 当时dreamoon已经是世界上的顶级选手,甚至前一场的div1他排名第3!(当时cf的分制和现在不同,所以现在看起来只是个红名) 由于他没有拿到过div2的第一名,于是决定一直故意掉分使自己有资格打级别较低的div2场。 这个机会终于到来,but当dreamoon决定在这一场暴露大佬本质并拿下第一之时……他被狙了。 没错,被一个更牛逼的神仙开个小号调戏了…… 回归正题来讲。 dreamoon作为一个世界顶级选手,罕见地给全世界众萌新发放了福利!本期为他在codeforces上的blog:If you ask me how to improve your algorithm competition skill, I will give you the link of this blog.(如果你问我如何提高算法竞赛水平,我将给你这篇博客的链接),原文链接为: http://codeforces.com/blog/entry/16599 以下为AlphaWA的翻译,如有不准确之处,见谅;另,博客下的讨论请读者移步原文链接查看,此处就不做提供了。 正文: 最近一年有许多人在发消息问我同样的问题,所以我决定创建这篇博客。 丑话说在前头,读完这篇博客你可能会感到失望

一个导致JVM物理内存消耗大的Bug

大憨熊 提交于 2020-07-27 01:20:18
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个Bug可能会导致大量物理内存被使用,我们已经反馈给了社区,并得到快速反馈,预计在OpenJDK8最新版中发布(JDK11中也存在这个问题)。 PS:用户的那个问题最终也解决了,定位下来算是C2的一个设计缺陷导致大量内存被使用,安全性上没有得到保障。 找出消耗大内存的线程 接下来主要分享下这个BUG的发现过程,先要客户实时跟踪进程的情况,当内存使用明显上升的时候,通过/proc/<pid>/smaps,看到了不少64MB的内存分配,Rss也基本消耗完了。 7fd690000000-7fd693f23000 rw-p 00000000 00:00 0 Size: 64652 kB Rss: 64652 kB Pss: 64652 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 64652 kB Referenced: 64652 kB Anonymous: 64652 kB AnonHugePages: 0 kB Swap: