科技新闻

深入理解JVM

吃可爱长大的小学妹 提交于 2020-03-04 18:21:08
系统性能优化并不是一上来就是JVM优化,相反JVM优化几乎是最后的手段了。影响一个系统的性能的因素非常多,如图: 从服务本身来看,影响服务性能的主要包扣: 我们写代码时所选择的数据结构和算法 服务开启的线程时是否合理 WEB应用,WEB服务 JVM方面的影响 最后是操作系统的影响 从整个服务架构上来看还有: 数据持久化 服务间的远程调用 消息缓存等中间件的选择 常用的性能测试指标 响应时间 一个请求从提交到响应所耗费的时间,一般比较关注平均响应时间,和最大响应时间。 常用组件的响应时间: 操作|响应时间 ---|--- 打开一个站点 |几秒 数据库查询一条记录(有索引)| 十几毫秒 机械磁盘一次寻址定位| 4毫秒 从机械磁盘顺序读取1M数据 |2毫秒 从SSD磁盘顺序读取1M数据| 0.3毫秒 从远程分布式缓存Redis读取一个数据|0.5毫秒 从内存读取1M数据 |十几微妙 Java程序本地方法调用 |几微妙 网络传输2Kb数据 | 1微妙 从上述表格我们能看出: 数据持久化,使用SSD与使用机械硬盘相比性能可以提高将近10倍; 数据查询,数据如果直接在本地内存,那么它的读取效率比数据库快将近1000倍,比redis快30倍左右;如果数据在redis缓存,那么它的读取速度比数据库快30倍左右;这也是为什么使用缓存是提升系统性能的“银弹”的原因。 为监控而生的多级缓存框架

Springboot使用定时任务

痞子三分冷 提交于 2020-03-04 18:19:36
我接触到的定时任务是一个配合微信公众号消息推送的延时推送文案,也就是用户在关注后的X分钟后,X小时或者X天后,将提前写好的文案和填充的数据推送到客户关注的公众号那里。 当然还有其他应用场景也陆续用到了,比如定时同步数据,定时保存redis的缓存数据,定时更新缓存数据,定时执行某个任务等等。 一开始用的是部署到Linux之后使用crontab执行写好的curl 请求的shell命令。后来发现Spring真的是太简单了。 (1)新建一个文件夹,下面写一个定时任务的配置类。 (2)加入以下代码。 其中@EnableScheduling 标签就是开启了延时任务功能。 @Configuration标签将这个配置类交由容器管理,无需注入且全局生效。 @Scheduled标签表示这个方法就是要定时执行的一个定时任务。 package com . example . demo . scheduled ; import org . springframework . context . annotation . Configuration ; import org . springframework . scheduling . annotation . EnableScheduling ; import org . springframework . scheduling . annotation

水星卡住“等待锁定”

你离开我真会死。 提交于 2020-03-04 16:51:29
克隆Mercurial存储库时,在Windows中出现了蓝屏。 重新启动后,我现在收到几乎所有hg命令的以下消息: c:\src\>hg commit waiting for lock on repository c:\src\McVrsServer held by '\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' interrupted! Google没有帮助。 有小费吗? #1楼 如果仅在映射的驱动器上发生,则可能是错误 https://bitbucket.org/tortoisehg/thg/issue/889/cant-commit-file-over-network-share 。 使用UNC路径而不是驱动器号似乎可以避免此问题。 #2楼 当“等待锁定存储库”时,删除存储库文件: .hg/wlock (或者可以在 .hg/store/lock ) 删除锁定文件时,必须确保没有其他东西正在访问存储库。 (如果锁是零或空白的字符串,则几乎可以肯定是这样)。 #3楼 如果锁定的存储库是原始存储库,那么我无法想象它会对其进行 修改 以克隆它,因此,这只是防止您在中间对其进行更改并弄乱了克隆库。 卸下锁后应该没问题。 但是,新克隆的副本(如果是本地克隆

javascript错误处理

大城市里の小女人 提交于 2020-03-04 16:45:31
  当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错误:可能是语法错误,通常是程序员造成的编码错误或错别字;可能是拼写错误或语言中缺少的功能(可能由于浏览器差异);可能是由于来自服务器或用户的错误输出而导致的错误;也可能是由于许多其他不可预知的因素。   那么js有没有好的可以检测错误的呢?有的,那就是:throw、try 和 catch   JavaScript 抛出(throw)错误   当错误发生时,当事情出问题时,JavaScript 引擎通常会停止,并生成一个错误消息。   描述这种情况的技术术语是:JavaScript 将抛出一个错误。   JavaScript try 和 catch   try 语句允许我们定义在执行时进行错误测试的代码块。   catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。   JavaScript 语句 try 和 catch 是成对出现的。 1 try{ 2 //可能会导致错误的代码 3 }catch(error(function() { 4 /* Act on the event */ 5 }); 6 )   例子: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>W3Cschool教程

面向对象的软件开发方法

早过忘川 提交于 2020-03-04 15:45:31
一、了解什么是面向对象的软件开发方法 答:1、OOSD是一种把面向对象的思想应用于软件开发过程,是一种当今成熟的、普遍流行的软件开发方法 2、面向对象方法的解决思路是从现实世界中的客观对象入手,尽量运用人类的自然思维方式来构造软件系统。是一种运用对象、类、继承、封装、聚合、消息传送、多态性等概念来构造系统的软件开发方法。 3、面向对象方法中,把一切都看成是对象。对象是功能抽象和数据抽象的统一,较过程稳定。 二、面向对象软件开发的主要思想 答:1、按照人类的自然思维的方式,对客观世界建立软件模型。 2、客观实体和实体之间的联系构成了现实世界的所有问题。 3、面向对象技术将现实世界中的实体及相互关系映射为对象及对象间的关系,实体间的相互作用被映射为对象间的消息发送等。 三、面向对象方法的主要优点 答:(1)把易变的数据结构和部分功能封装在对象内并加以隐藏 i、保证了对象行为的可靠性。 ii、对其修改并不会影响其它对象,有利于维护,对需求变化有较强的适应。 (2)封装性和继承性有利于复用对象 i、把对象的属性和操作捆绑在一起,提高了对象(作为模块)的内聚性,减少了与其它对象的耦合,为复用对象提供了可能性和方便性。(高内聚,低耦合) ii、在继承结构中,特殊类对一般类的继承,本身就是对一般类的属性和操作的复用。 四、面向对象开发方法的组成 答:(1)OOA(Object-Oriented

如何阅读上次提交评论?

无人久伴 提交于 2020-03-04 12:08:33
通常在提交期间( $ git -commit -m "" ),我希望阅读我的最后一条评论,以记住我取得的进展。 有没有一种简单的方法可以通过命令行直接访问最后一次提交消息? (我正在使用Windows。) #1楼 git log -1 branch_name 将显示来自指定分支的最后一条消息(即不一定是您当前所在的分支)。 #2楼 我这样做了 git reflog -1 | sed 's/^.*: //' #3楼 对于更具可读性的内容,请运行以下命令: git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative" 这样当你运行时: git lg 你得到一个很好的读数。 仅显示最后一行: git lg -1 解决方法在 此处 #4楼 从 git log -1 --pretty='%s' 开始 git log -1 --pretty='%s' 但下面的内容涵盖了所有案例, git log --pretty='format:%Creset%s' --no-merges -1 没有多余的空白区域 丢弃合并提交

Android:异步处理之Handler+Thread的应用(一)

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-04 07:48:42
前言   如果你在阅读本文之前,你不知道Handler在Android中为何物,我建议你先看看本系列的第一篇博文《 Android:异步处理之Handler+Thread的应用(一) 》;我们都知道在Android系统中不能在子线程中直接更新UI界面,所以我们一般借助Handler+Thread或者AsyncTask这两种方法来实现UI界面的更新。而Handler+Thread这方法其实就是子线程向UI主线程进行消息传递,通知UI主线程去更新界面的一套机制。因为有时候面试官比较喜欢和蔼可亲的考你Handler的这套机制,所以我们结合源代码深入的研究这套通讯机制是灰常有必要的,你想想如果能鄙视一下面试官,呵呵o(╯□╰)o。。 概述   谷歌的这套消息机制是参考windows设计的,姑爷微爷之间有啥专利官司咱也不关心。一般来说,线程都会通过Looper来建立自己的消息循环,并且锁定一个FIFO的消息队列MessageQueue,Handler通过Looper来实现Message(消息)在MessageQueue中的存取。每一个Hanlder在实例化的时候都会自动或者手动绑定一个Looper,间接向一个MessageQueue发送Message,所以Handler也封装了消息发送和接收的接口。 入门例子   看概述好闷的,琢磨文字不说,晦涩又难懂,记得住又成一个大问题

AR独角兽的死亡教训:融资3亿美元,成投资人木偶,营销大于技术

与世无争的帅哥 提交于 2020-03-04 07:22:03
这样的AR产品,是不是颇有些酷炫与实用兼具的味道? 然而,打造这款产品的AR独角兽企业Daqri,最新的消息令人叹息:就在最近,它最后的一点遗产,被Snap收购了。 是的,这家曾融资 3亿美元 ,满世界收购AR初创公司,被称作Magic Leap“头号敌人”,还与微软HoloLens叫板的明星AR公司,在成立十年之后,总部关闭、员工遣散、资产变卖。 2020年到来,该公司CEO Roy Ashok放言的“预计2020年出货数万副AR眼镜”,没想到却遭遇了现实的骨感。 Snap接手了Daqri的部分资产和20余名员工,包括CTO Daniel Wagner。虽然收购价格没有公布,但从时间上来推断,这笔交易与其年度报告中披露的3400万美元收购案相吻合。 更令人慨叹的是,更多Daqri倒下的幕后故事被一一曝光——它的倒下不是一次理想主义创业的失利,而是一次“演技派”的无以为继。 曾经融资3亿美元,引领AR热潮 成立于2010年的Daqri,总部位于洛杉矶。作为早期的一批AR初创企业,在AR领域亦曾风头无两。 2013年,Daqri筹集了1500万美元(约合人民币9180万元)A轮融资,由Tarsadia Investments领投。 到了2017年,其融资总额达到了2.75亿美元(约合人民币18.7亿元),后来Tarsadia Investments进一步加码,融资总额达到了3亿美元。

AES五种加密模式

微笑、不失礼 提交于 2020-03-04 07:20:51
分组密码在加密时明文分组的长度是固定的,而实用中待加密消息的数据量是不定的,数据格式可能是多种多样的。为了 能在各种应用场合安全地使用分组密码 ,通常对不同的使用目的运用不同的工作模式。 一、电码本模式(ECB) 将整个明文分成若干段相同的小段,然后对每一小段进行加密。 优:操作简单,易于实现;分组独立,易于并行;误差不会被传送。——简单,可并行,不传送误差。 缺:掩盖不了明文结构信息,难以抵抗统计分析攻击。——可对明文进行主动攻击。 二、密码分组链模式(CBC) 先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。 优点 :能掩盖明文结构信息,保证相同密文可得不同明文,所以不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL和IPSec的标准。 缺点 :(1)不利于并行计算;(2)传递误差——前一个出错则后续全错;(3)第一个明文块需要与一个初始化向量IV进行抑或,初始化向量IV的选取比较复杂。 初始化IV的选取方式 :固定IV,计数器IV,随机IV(只能得到伪随机数,用的最多),瞬时IV(难以得到瞬时值) 三、输出反馈模式(OFB) 密码算法的输出(指密码key而不是密文)会反馈到密码算法的输入中,OFB模式并不是通过密码算法对明文直接加密,而是通过将明文分组和密码算法的输出进行XOR来产生密文分组。 优点

c# 进程间通信

只谈情不闲聊 提交于 2020-03-04 05:47:34
一、 进程间通讯的方式 进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过 socket 口、配置文件和注册表 等来间接实现进程 间数据 通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和 socket 套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存和发送消息两种。 二、 发送消息实现 进程间通讯前准备 下面的例子用到一个windows api 32函数 [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP); 要有此函数,需要添加using System.Runtime.InteropServices;命名空间 此方法各个参数表示的意义 wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。 msg