Browsed by
标签:JVM

架构设计-谈谈架构

架构设计-谈谈架构

閱讀本文約花費: 32 (分鐘) 本文首先介绍了架构的概念定义,并介绍如何针对当前需求,选择合适的应用架构,希望对您的学习有所帮助。 1、什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。 此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的手段,如果对架构概念理解不一样,那沟通起来自然不顺畅。 Linux有架构,MySQL有架构,JVM也有架构,使用Java开发、MySQL存储、跑在Linux上的业务系统也有架构,应该关注哪一个?想要清楚以上问题需要梳理几个有关系又相似的概念:系统与子系统、模块与组建、框架与架构: 一、系统与子系统 系统:泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能独立完成的工作能力的群体。 子系统:也是由一群关联的个体组成的系统,多半是在更大的系统中的一部分。 二、模块与组件 都是系统的组成部分,从不同角度拆分系统而已。模块是逻辑单元,组件是物理单元。 模块就是从逻辑上将系统分解, 即分而治之, 将复杂问题简单化。模块的粒度可大可小, 可以是系统,几个子系统、某个服务,函数, 类,方法、 功能块等等。 组件可以包括应用服务、数据库、网络、物理机、还可以包括MQ、容器、Nginx等技术组件。 三、框架与架构 框架是组件实现的规…

Read More Read More

Java 常见的几种 OOM

Java 常见的几种 OOM

閱讀本文約花費: 6 (分鐘)1、StackOverflowError(栈空间溢出) public class StackOverflowErrorDemo { public static void main(String[] args) { main(args); // Exception in thread “main” java.lang.StackOverflowError }} 上面这种 OOM 比较好理解,在 main 方法中循环调用 main 方法,循环产生的大量形参都会在栈空间进行创建,当超过栈空间的大小,就会导致栈空间溢出,发生 OOM。 2、Java Heap Space(堆空间溢出) public class JavaHeapSpaceDemo { public static void main(String[] args) { // 我配置了虚拟机参数 -Xms10m -Xmx10m 初始化堆内存和最大堆内存都是 10m byte[] b = new byte[20 * 1024 * 1024]; // 这里 new 了 20m 的字节数组 // Exception in thread “main” java.lang.OutOfMemoryError: Java heap space }} 上面的这个 OOM 也比较好理解,我给 JVM 设置的初始化堆内存…

Read More Read More

分布式定时任务调度框架实践

分布式定时任务调度框架实践

閱讀本文約花費: 14 (分鐘)分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。 一、业务背景 1.1 为什么需要使用定时任务调度 (1)时间驱动处理场景:整点发送优惠券,每天更新收益,每天刷新标签数据和人群数据。 (2)批量处理数据:按月批量统计报表数据,批量更新短信状态,实时性要求不高。 (3)异步执行解耦:活动状态刷新,异步执行离线查询,与内部逻辑解耦。 1.2 使用需求和痛点 (1)任务执行监控告警能力。 (2)任务可灵活动态配置,无需重启。 (3)业务透明,低耦合,配置精简,开发方便。 (4)易测试。 (5)高可用,无单点故障。 (6)任务不可重复执行,防止逻辑异常。 (7)大任务的分发并行处理能力。 二、开源框架实践与探索  2.1 Java 原生 Timer 和ScheduledExecutorService 2.1.1 Timer使用 Timer缺陷: Timer底层是使用单线程来处理多个Timer任务,这意味着所有任务实际上都是串行执行,前一个任务的延迟会影响到之后的任务的执行。 由于单线程的缘故,一旦某个定时任务在运行时,产生未处理的异常,那么不仅当前这个线程会停止,所有的定时任务都会停止。 Timer任…

Read More Read More

云上 ARM 实例应用优化之我见

云上 ARM 实例应用优化之我见

閱讀本文約花費: 22 (分鐘) 亚马逊AWS官方博客 发布于:2020 年 8 月 10 日 10:00 ARM 处理器的崛起 过去两个月的科技媒体上关于 ARM 芯片的新闻可谓是高潮迭起,不断的引起人们的关注。 首先是在 5 月 11 日,AWS 宣布了基于自研的 Graviton 2 处理器(使用了 ARM Neoverse N1 核心)的第六代 EC2 实例 – M6g 正式发布。这似乎揭开了云计算市场上 ARM 处理器大规模应用的的序幕。 紧接着,在今年 6 月 23 日的 WWDC 大会上,Apple 公司宣布了一个影响深远的决定: 计划从 2020 年年底开始,Mac 计算机将会从 Intel 芯片过渡到使用基于 ARM 的自研芯片。也许我们要问,ARM 处理器将将会在桌面设备上复制移动设备的成功吗? 第三则新闻是关于高性能计算。6 月 22 日发表的最新的一期 TOP500 榜单上,日本的 Fugaku 系统以 415.5 千万亿次浮点运算的高性能 LINPAC 成绩成为 TOP500 的第一名。而令人惊讶的是这是第一个使用 ARM 处理器的高性能处理系统。 林林总总,即使我们是半导体行业的门外汉也不难得出一个结论 – ARM 处理器不仅仅统治了手机、嵌入式应用这些传统的优势领域,或将在桌面系统、高性能计算尤其是云计算领域扮演越来越重要的角色。 EC2 上的 ARM…

Read More Read More

Executor看不懂?教你如何盘它

Executor看不懂?教你如何盘它

閱讀本文約花費: 11 (分鐘)前言 肥壕最近在复习线程这一块知识, Executor、ExecutorService、ThreadPoolExecutor 这三兄弟总感觉很难辨认,每次看完后没过多久又会忘,所以今天特地来盘一下 Executor 框架。 正文 Executors 是在 JDK1.5 引入的,位于 java.util.concurrent包下,其主要目的是简化线程调用,管理线程的生命周期(启动、执行、关闭)。 在 JDK1.5 之前我们使用线程的姿势是: JDK1.5之后呢,我们可以使用 Executor 直接执行的 Runnable 实现类: 这两种方式对比,很显然第二种更为优雅。我们的关注点是把任务交给执行器,至于任务的怎么执行我们是不需关心的,这也实现了任务与调用者之间的解耦。 我们先看一下 Executors 中各个类之间的依赖图: Executor:定义方法 execute(Runnable command),该方法接收一个 Runable 实例 ExecutorService: 继承 Executor 接口,并提供了生命周期管理的方法,以及可以跟踪异步任务执行状况返回 Future 的方法 AbstractExecutorService:抽象类,实现 ExecutorService 接口 Thr…

Read More Read More

我是如何参与硅谷顶级开源项目并赚得 2500 美金

我是如何参与硅谷顶级开源项目并赚得 2500 美金

閱讀本文約花費: 6 (分鐘)初识MinIO 三年前,公司要做一个分布式存储的选型,当时考察了Ceph、FastDFS、GlusterFS和MinIO,经过慎重考虑,最终我们选型了MinIO。在选型MinIO的过程中,我也通过github加入到这个开源组织。在17年的时候,MinIO还远没现在这么完善,软件有bug,特性不全,连中文文档也没有,而且也不出名,github上只有几千个star。为了方便公司使用,我就打算翻译MinIO的使用文档,不过转念一想,要玩就玩大点,既然没有中文官方文档,为何我不能来写中文官方文档。于是我就在社区中找到MinIO的创始人Anand Babu Periasamy,和他说,我看MinIO没有中文官方文档,要不我来翻译如何。他欣然接受,并安排MinIO的开发人员Kannappan与我对接。 翻译MinIO中文官方文档 以前没参与过大型的github开源项目,为了能让这个工作顺利进行,我了解了一下github开源项目的合作机制,开源社区的文化、习惯,避免被别人说STFW和RTFM。 翻译工作对我来说倒没什么难的,过程也很顺畅,大概花了一两天把核心文档翻译完了,也顺利合并到主干。这时候MinIO的一个开发人员找到我,和我说: [ ](https://imgchr.com/i/aRaKxJ) 其实我和第一次听他这么说,我心里是拒绝的,我这好好的参与开源,怎么…

Read More Read More

让开发部署提速8倍,我参与这款的插件的全过程

让开发部署提速8倍,我参与这款的插件的全过程

閱讀本文約花費: 20 (分鐘)如何像参与开源那样,去参与一款 IDE 插件的设计? 作为一款 IDE 插件的使用者,我是否能决定下一个版本的功能? 自从产品经理银时小伙和他的开发小哥们在去年12月发布 Cloud Toolkit(一款 IDE 插件)以来,已帮助数以万计的开发者们提高了业务的部署效率。期间,开发者们不仅是 Cloud Toolkit 的使用者,同时也作为设计者参与了插件的更新迭代。 本文来自开发者徐靖峰,分享了他和 Cloud Toolkit 的故事 遇见 Cloud Toolkit 在与中间件小姐姐的一次聊天中,偶然间了解到这款插件,小姐姐跟我提到自己正在运营一款 IDE 开发者工具,能够使开发部署效率提高 8 倍,出于好奇心,我就上手体验了一下,看看究竟是一个什么样的产品。使用了一段时间之后,便迫不及待地向小姐姐分享了我作为开发者对插件的一些看法。 我对这款产品最直观的感受:这是一款发布工具,帮助用户在 IDE 中直接打包应用并部署到各种终端。一开始看到这款产品位于阿里云的页面中,原本以为是一款和阿里云服务强绑定的产品,但试用过后才发现,即使对于普通的云主机,也非常适用,还可以解决很多开发运维的痛点,非阿里云用户可以放心使用。 在 Cloud Toolkit 出现之前 作为一个 Java 程序员,我们大多数会在 Intellij IDEA 中基于 S…

Read More Read More

甲骨文:有史以来最伟大的25个Java应用程序

甲骨文:有史以来最伟大的25个Java应用程序

閱讀本文約花費: 22 (分鐘)作者 | Alexa Morales译者 | 刘雅梦策划 | TinaJava 的故事始于 1991 年,当时 Sun Microsystems 试图将其在计算机工作站市场的领先地位扩展到新兴且发展迅速的个人电子产品市场。几乎没有人预料到 Sun 即将创建的编程语言会使计算大众化,激发了一个全球范围的社区,并成为了一个由语言、运行时平台、SDK、开源项目以及许多工具组成的持久软件开发生态系统的平台。经过 James Gosling 领导的数年秘密开发之后,Sun 于 1995 年发布了具有里程碑意义的“一次编写,随处运行” 的 Java 平台,并将重点从最初的交互式电视系统设计转到了新兴的万维网应用程序上。在本世纪初,Java 就已经开始为从智能卡到太空飞行器的一切制作动画了。 如今,数以百万计的开发人员在使用 Java 编程,Java 仍然在以越来越快的步伐向前发展。在 Java 诞生 25 周年之际,Java Magazine(Oracle 的双月刊)联合 Oracle Java 开发团队,共同撰文回顾 Java 是如何塑造我们这个星球的。 以下是迄今为止,最具创意和影响力的 25 个 Java 应用程序, 包含了从 Wikipedia Search 到美国国家安全局的 Ghidra 等。这些应用包罗万象,覆盖了包括:太空探索、视频游戏…

Read More Read More

微服务网关

微服务网关

閱讀本文約花費: 14 (分鐘) 本文阐述微服务的API网关的一些主要功能,并例举了几种常用的网关,最后结合spring cloud微服务框架对网关做一些简要的论述。 一、前言 随着微服务的兴起,基于其业务耦合性低、负载能力强、服务边界清晰等优点,大家纷纷使用微服务架构来实现新系统或进行老系统的改造。微服务在带来诸多好处的同时,也有一些问题需要解决,比如:如何做到有效拆分、减少服务间调用,如何统一管理所有服务的接口,如何进行自动化部署等。本文阐述微服务的API网关的一些主要功能,并例举了几种常用的网关,最后结合spring cloud微服务框架对网关做一些简要的论述。 二、API网关简介 API网关,顾名思义,是统一管理API的一个网络关口、通道,是整个微服务平台所有请求的唯一入口,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。下图为微服务架构的简单示意图,网关起到的作用一目了然。 三、API网关的作用 为微服务云平台提供统一的入口是API网关最主要的用途,除此之外,网关还可承担认证授权、访问控制、路由、负载均衡、缓存、日志、限流限额、转换、映射、过滤、熔断、注册、服务编排、API管理、监控、统计分析等等非业务性的功能。 所以实现或者选择一个好的API网关,是建设容器云和微服务体系中一个至关重要的事项。这也决定了API网关的部署,要尽可能的减少接触面…

Read More Read More

微服务与网关技术(SIA-GateWay)

微服务与网关技术(SIA-GateWay)

閱讀本文約花費: 18 (分鐘) 编辑推荐:文章主要介绍了微服务架构特性,微服务网关的分类以及作用,SIA-GateWay等,希望能对您有所帮助。 一. 背景 软件架构,总是在不断的演进中… 把时间退回到二十年之前,当时企业级领域研发主要推崇的还是 C/S 模式,PB、Delphi 这样的开发软件是企业应用开发的主流。随着时间不断的推移,基于浏览器的的 B/S 架构开始渐渐流行了起来。初期,Web 开发 ASP 还占据了不少优势,但 JSP 的预编译模式让性能有了很大的提升,随后基于 JAVA 语言的 J2EE 架构变的越来越流行。 早期软件架构基本都是单体架构,系统之间往往不需要进行交互,这也导致数据孤岛和 ETL 工具的发展。随着企业应用越来多,相互的关系也越来密切。应用之间也迫切需要进行实时交互访问,随后基于 XML 的异构系统集成和数据交互技术开始被很多公司采用,SOA 的概念被提了出来,web service 逐渐流行起来。 互联网时代,很多公司为了适应更加灵活的业务需求,基于 HTTP 协议和 Restful 的架构风格及简洁和结构清晰的 JSON 语言成为企业开发的最佳实践,在 SOA 架构中,企业服务总线技术 ESB 所暴露的集中式架构的劣势让开发者明白基于注册和发现的分布式架构才是解决问题的关键办法。由此,微服务架构逐渐流行起来。 在《微服务设计》中如…

Read More Read More

线程池运用不当的一次线上事故

线程池运用不当的一次线上事故

閱讀本文約花費: 11 (分鐘)在高并发、异步化等场景,线程池的运用可以说无处不在。线程池从本质上来讲,即通过空间换取时间,因为线程的创建和销毁都是要消耗资源和时间的,对于大量使用线程的场景,使用池化管理可以延迟线程的销毁,大大提高单个线程的复用能力,进一步提升整体性能。 今天遇到了一个比较典型的线上问题,刚好和线程池有关,另外涉及到死锁、jstack命令的使用、JDK不同线程池的适合场景等知识点,同时整个调查思路可以借鉴,特此记录和分享一下。 01 业务背景描述 该线上问题发生在广告系统的核心扣费服务,首先简单交代下大致的业务流程,方便理解问题。 绿框部分即扣费服务在广告召回扣费流程中所处的位置,简单理解:当用户点击一个广告后,会从C端发起一次实时扣费请求(CPC,按点击扣费模式),扣费服务则承接了该动作的核心业务逻辑:包括执行反作弊策略、创建扣费记录、click日志埋点等。 02 问题现象和业务影响 12月2号晚上11点左右,我们收到了一个线上告警通知:扣费服务的线程池任务队列大小远远超出了设定阈值,而且队列大小随着时间推移还在持续变大。详细告警内容如下: 相应的,我们的广告指标:点击数、收入等也出现了非常明显的下滑,几乎同时发出了业务告警通知。其中,点击数指标对应的曲线表现如下: 该线上故障发生在流量高峰期,持续了将近30分钟后才恢复正常。 03 问题调查和事故解决过程 下面…

Read More Read More

JVM各种垃圾收集算法

JVM各种垃圾收集算法

閱讀本文約花費: 7 (分鐘)前言 从如何判定对象消亡的角度出发,垃圾收集算法可以划分为“引用计数式垃圾收集”(Reference Counting GC)和“追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”。由于束流Java虚拟机中使用 的都是“追踪式垃圾收集”,所以后续介绍的垃圾收集算法都是属于追踪式的垃圾收集。 分代式收集理论 当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计。主要简历在两个分代假说之上:1、弱分代假说:绝大多数对象都是“朝生夕灭”的。2、强分代假说:熬过越多此垃圾收集过程的对象就越难以消亡。这两个分代假说奠定了多款常用的垃圾收集器的一致设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。把分代收集理论具体放到现在商用的Java虚拟机里,设计者一般至少会把Java堆划分为新生代(Young Generation) 和 老年代(Old Generation两个区域。在新生代中,每次垃圾收集时都有大批对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。 标记-清除算法 标记-清除算法,分为“标记”和“清除”两个阶段:首先标记所有需要回收的对象,标记完成后,统一回收掉所有被标记的对象,也…

Read More Read More

云原生应用 Kubernetes 监控与弹性实践

云原生应用 Kubernetes 监控与弹性实践

閱讀本文約花費: 8 (分鐘) 本文向大家介绍一个云原生应用该如何在Kubernetes中无缝集成监控和弹性能力。希望对您的学习有所帮助。 前言 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过Cloud Provider、CRD Controller、Operator等等的方式从Kubernetes的标准接口向业务层透出。开发者可以基于Kubernetes来构建自己的云原生应用与平台,Kubernetes成为了构建平台的平台。 阿里云容器服务Kubernetes的监控总览 云服务集成 阿里云容器服务Kubernetes目前已经和四款监控云服务进行了打通,分别是SLS(日志服务)、ARMS(应用性能监控)、AHAS(架构感知监控服务)、Cloud Monitor(云监控)。 SLS主要负责日志的采集、分析。在阿里云容器服务Kubernetes中,SLS可以采集三种不同类型的日志 APIServer等核心组件的日志 Service Mesh/Ingress等接入层的日志 应用的标准日志 除了采集日志的标准链路外,SLS还提供了上层的日志分析能力,默认提供了基于APIServer的审计分析能力、接入层的可观测性展现、应用层的日志分析。在阿里云容器服务Kubernetes中,日志组件…

Read More Read More

AtomicLongFieldUpdater、AtomicLong、Volatile

AtomicLongFieldUpdater、AtomicLong、Volatile

閱讀本文約花費: 3 (分鐘)初次认识AtomicLongFieldUpdater这个类是在druid源码中看到的,当时很陌生又很好奇,druid中源码是这样的: JavaCopy 定义的一个静态的且不可修改引用的类成员变量,从定义的名称“executeQueryCountUpdater”可以看出来,它是用于执行计数用的。但一时又不明白为什么这样用,它的优点在哪里,为什么不直接用AtomicLong呢,它也是可以原子更新的,线程安全的。于是我搜了一下executeQueryCount,发现类中有这个名称定义的另一个成员变更,源码中是这样定义的: JavaCopy 这个成员变量是long型,且使用了volatile关键字修饰,被volatile修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。但是呢,如果对值要进行修改,因为volatile并不能保证值是原子操作的,就需要对修改值的方法使用同步了。至于为什么使用AtomicLongFieldUpdater,还是没有一个清醒的认识,于是看了一下这个类的源码,首先这个类是一个抽象类,类的注释是这样写的: A reflection-based utility that enables atomic updates to designated fields of designated classes.意思是这个类是基于反射的…

Read More Read More

面试官:你知道java类是怎么跑起来的吗?问的我一脸懵

面试官:你知道java类是怎么跑起来的吗?问的我一脸懵

閱讀本文約花費: 15 (分鐘)类从加载虚拟机内存中开始到卸载出内存为止,生命周期包括:加载、验证、准备、解析、初始化、使用、卸载。 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序进行,而解析阶段则不一定,它在某些情况下可能在初始化阶段后在开始,因为java支持运行时绑定。 加载阶段 通过一个类的全限定名来获取定义此类的二进制字节流(没有指明二进制字节流要从一个Class文件中获取,可以从ZIP包中读取,从网络中获取,运行时计算生成等等) 然后,将这个字节流所代表的静态储存结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。 该Class对象作为方法区这个类的各种数据的访问入口完成后,虚拟机外部的二进制字节流就按照虚拟机所需格式储存在方法区中。 这里稍微理解一下对象和类的概念,对象是实例化的类。类的信息是存储在方法区中的,对象是存储在Java堆中的。类是对象的模板,对象是类的实例。 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是前面所有程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。除此之外,开发者可以通过继承ClassLoader基类来创建自己的类加载器。 其实加载阶段用一句话…

Read More Read More

Coolshell:应该知道的Linux技巧

Coolshell:应该知道的Linux技巧

閱讀本文約花費: 14 (分鐘)这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— Linux用户有哪些应该知道的提高效率的技巧。我觉得挺好的,总结得比较好,把其转过来,并加了一些自己的理解。 首先,我想告诉大家,在Unix/Linux下,最有效率技巧的不是操作图形界面,而是命令行操作,因为命令行意味着自动化。如果你看过《你可能不知道的Shell》以及《28个Unix/Linux的命令行神器》你就会知道Linux有多强大,这个强大完全来自于命令行,于是,就算你不知道怎么去做一个环保主义的程序员,至少他们可以让你少熬点夜,从而有利于你的身体健康和性生活。下面是一个有点长的列表,正如作者所说,你并不需要知道所有的这些东西,但是如果你还在很沉重地在使用Linux的话,这些东西都值得你看一看。 (注:如果你想知道下面涉及到的命令的更多的用法,你一定要man一点。对于一些命令,你可以需要先yum或apt-get来安装一下,如果有什么问题,别忘了Google。如果你要Baidu的话,我仅代表这个地球上所有的生物包括微生物甚至细菌病毒和小强BS你到宇宙毁灭) 基础 学习 Bash 。你可以man bash来看看bash的东西,并不复杂也并不长。你用别的sh…

Read More Read More

Scroll Up