CAS

第2章—Java内存区域与内存溢出异常

空扰寡人 提交于 2020-05-02 15:40:01
2.1 概述 总结:本章将从概念上介绍 Java 虚拟机内存的各个区域,讲解这些区域的作用、服务对象以及其中可能产生的问题。 2.2 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁时间 2.2.1 程序计数器(线程私有) 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任意一个确定的时刻,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能回复到正确的执行位置,每条线程都需要有一个独立的程序计数器。 如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址; 如果线程正在执行的是 Native 方法,这个计数器值则为空。 可能出现的异常:此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域 2.2.2 Java 虚拟机栈(线程私有) Java 虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 局部变量表存放了编译期可知的各种数据类型、对象引用和 returnAddress 类型

PHP扩展memcached、memcache对比-2019.05.11

半腔热情 提交于 2020-05-02 06:35:51
###背景 此文是之前开发过程中,出于对版本更新的疑问,以及新版本解决了什么问题的一个回答,简单总结交流。 我们在业务中广泛使用memcache做缓存,我们都了解memcached本身不支持分布式,业务上会使用客户端分布式算法(一致性hash)保证分布式缓存集群性能和可用性。客户端将多个mc实例维护成一个缓存池,根据缓存key值进行一致性hash计算,写入具体指定的hash节点。由于单机可用性无法保证,若要体现此mc集群的高可用,对于单点故障机器的剔除就十分重要。但目前框架内使用的memcached扩展(也是行业内一致推荐的扩展)却没能很好的完成这一功能(或者是设置上没有正确设置),当集群中一个实例挂掉之后,hash到这台机器上的set、get方法全部失效,没有保证集群的可用。而memcache扩展在出现单节点挂掉的情况下,会把key路由到新的alive节点上,保证集群的可用性。那么问题就来了,为什么在更“新”,更“先进”的memcached扩展内却没有完成如此好特性?是有坑?还是实现上会有问题?值得深究一番。 ###参考资料 《memcached - PHPClientComparison.wiki》 《Memcache 和 Memcached 客户端的区别》 《Memcached集群/分布式的单点故障》 ###正文 几篇博文里都说memcache有缺陷,总结一下核心缺陷:

前后端分离后的CAS单点登录流程详解

白昼怎懂夜的黑 提交于 2020-05-02 04:22:27
CAS 单点登录Web工作流程 如图流程清晰,可以去官网了解https://github.com/apereo。 下面看前后端分离的架构: 假设公司有多个系统希望能统一登录认证一次都可以访问,如订单管理系统(oms),商品管理系统(pms),客户管理系统(crm),例如:用户访问 oms 系统拦截请求发现没有登录,就跳转到cas server 去登录,登录完成后签发一个ST,重定向到oms系统,oms拿着回传的参数ST去CAS验证,验证通过后,允许用户访问资源,如果是前后端分离的应用,系统就由原来的单个应用,分为前后端分开部署(动静分离),前端的静态服务(html,css.js),后端的(api接口),这时候用户端浏览器先访问前端加载静态资源,然后再向后端api发起请求,后端api 接口通过过滤器鉴权。如果cas server 登录后跳转到后端服务地址肯定是不行的,这时候可以在服务端i在完成验证后继续跳转到前端地址,index.jsp: <%@ page import ="com.ctrip.framework.apollo.ConfigService" %> <%@ page import ="com.ctrip.framework.apollo.Config" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <

Inceptor命令02-命令使用

一笑奈何 提交于 2020-05-01 20:52:10
beeline使用方式 1. 无认证 ./beeline -u jdbc:hive2://{inceptor_server}:10000 2. 使用Kerberos认证 kinit -kt /etc/sql2/hive.keytab hive/baogang2@TDH klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: hive/baogang2@TDH Valid starting Expires Service principal 11/21/15 15:27:03 11/22/15 01:27:03 krbtgt/TDH@TDH renew until 11/22/15 15:27:03 这时,您连接Inceptor时的身份就是hive。连接Inceptor的指令是: 模板:beeline -u "jdbc:hive2://<server_ip/hostname>:10000/default;principal=<hive_principal>" beeline -u "jdbc:hive2://baogang2:10000/default;principal=hive/baogang2@TDH" 3. LDAP认证 您需要通过LDAP的认证连接到Inceptor: beeline -u "jdbc:hive2:

《深入理解 Java 虚拟机》读书笔记:Java 内存区域与内存溢出异常

删除回忆录丶 提交于 2020-05-01 16:37:15
前言 最近开始看这本书,记得前段时间拿起这本书的时候,心情是相当沉重的!当时的剧本是这样的—— 内景。家里 - 下午 我(画外):唉,有点无聊啊!(偶然撇过书架)这么多书得看到什么时候啊,要不要拿一本翻翻呢?但是在家里好像有点看不下去啊,是太安逸了吗?最近那本《图解 HTTP》也还没看完,感觉暂时有点不想看了。(走到书架前)还是挑几本优先级比较高的带到███下班的时候看吧。(沉思)嗯,这本带过去~ 当我拿起《深入理解 Java 虚拟机》这本书的那一刻,心里咯噔一下——唉,PM10 浓度又上升了,地球环境越来越差了啊,万恶的地球人! 正文 一、运行时数据区域 Java 虚拟机在执行 Java 程序时,会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁时间。 1、程序计数器 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 线程私有:为了线程切换后能恢复到正确的执行位置,因此每条线程都需要有一个独立的程序计数器。 唯一一个不会出现 OutOfMemoryError 异常的区域。 2、Java 虚拟机栈 虚拟机栈描述的是 Java 方法执行的内存模型:Java 方法在执行时会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息

3万字长文概述:通俗易懂告诉你什么是.NET?什么是.NET Framework?什么是.NET Core?

左心房为你撑大大i 提交于 2020-05-01 07:12:06
【转载】 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包括:CLS、CTS(CLI)、FCL、Windows下CLR的相关核心组成、Windows下托管程序运行概念、什么是.NET Framework,.NET Core,.NET Standard及一些VS编译器相关杂项和相关阅读链接。完整的从上读到下则你可以理解个大概的.NET体系。 文章是我一字一字亲手码出来的,每天下班用休息时间写一点,持续了二十来天。且对于文章上下衔接、概念引入花了很多心思,致力让很多概念在本文中显得通俗。但毕竟.NET系统很庞大,本文篇幅有限,所以在部分小节中我会给出延伸阅读的链接,在文章结尾我给出了一些小的建议,希望能对需要帮助的人带来帮助,如果想与我交流可以文章留言或者加.NET技术交流群:166843154 目录 .NET和C#是什么关系 跨语言和跨平台是什么 什么是跨语言互操作,什么是CLS CLS异常 什么是CTS? 什么是类库? 什么是基础类库BCL? 什么是框架类库FCL? 什么是基元类型? System.Object的意义 计算机是如何运行程序的?

数据备份恢复软件,防止勒索病毒

别来无恙 提交于 2020-04-30 17:47:21
企业数据保护需要备份/恢复功能软件吗? 为企业服务器上的磁盘存储增加一重数据防护,防止介质故障。 为企业保护备份数据远离外部,阻止人为擅自修改灾备介质服务器上备份数据,在生产设备数据损坏时,数据可以从灾备介质服务器上迅速找回。 为本地虚拟化、私有云平台、和公有云中的数据全面保护,防止意外发生。 为对抗勒索病毒感染时,避免企业无法接受的损失。 基础架构IaaS保护服务 基础架构保护是针对客户基础架构中生产工作负载,进行备份和智能恢复的基础设施保护服务,基础架构保护服务凭借广泛的IT环境兼容性和丰富的数据保护技术,以一套方案即可实现全面保护,帮助客户轻松处理日常任务。 私有云平台保护服务 私有云平台保护提供了针对FusionCloud、H3C CAS、 OpenStack开发的私有云平台备份/恢复功能,可同时兼容多个私有云平台场景,可满足不同租户SLA保证。 虚拟化架构保护服务 虚拟化架构保护提供了针对VMware虚拟化平台的高性能无代理备份/恢复功能,Fusion Compute虚拟化备份/恢复功能,Hyper-v虚拟化平台备份/恢复功能,兼容多个虚拟化场景灾备需要。 卷级备份/恢复服务 磁盘卷级数据保护是针对客户基础架构中磁盘或存储或挂载卷,进行备份和智能恢复的数据保护服务,磁盘卷级数据保护服务凭借广泛的存储介质环境兼容性和丰富的数据保护技术,可以帮用户提供定时或实时性数据保护。

原子操作&普通锁&读写锁

谁都会走 提交于 2020-04-30 02:32:15
一:原子操作CAS(compare-and-swap) 原子操作分三步:读取addr的值,和old进行比较,如果相等,则将new赋值给*addr,他能保证这三步一起执行完成,叫原子操作也就是说它不能再分了,当有一个CPU在访问这块内容addr时,其他CPU就不能访问 func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool ) TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$ 0 - 25 MOVD addr + 0 (FP), R3 MOVD old + 8 (FP), R4 MOVD new + 16 (FP), R5 SYNC LDAR (R3), R6 CMP R6, R4 BNE 7 (PC) STDCCC R5, (R3) BNE - 4 (PC) ISYNC MOVD $ 1 , R3 MOVB R3, swapped + 24 (FP) RET MOVB R0, swapped + 24 (FP) RET 二:普通锁 加锁(Mutex.Lock) 1:原子操作加锁:原子操作判断是否已经被加锁,如果没有加锁,原子操作加锁,直接返回,很快吗! 2:执行旋转锁:已经被加锁,判断是否可以执行旋转锁,执行旋转锁,原子判断是否可以加锁,若可以,加锁返回 3

原子操作的实现原理

拈花ヽ惹草 提交于 2020-04-29 21:04:13
1. 处理器如何实现原子操作 1.1 使用总线锁 1.2 使用缓存锁 2. Java如何实现原子操作 2.1 偏向锁 线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需简单地测试一下对象头的Mark Word里是否 存储着指向当前线程的偏向锁。 如果测试成功,表示线程已经获得了锁。 如果测试失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁): 2.1 如果没有设置,则使用CAS竞争锁; 2.1 如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程。 2.2 使用循环CAS 具体实现细节 JVM中的CAS操作正是利用了 处理器 提供的 CMPXCHG指令 实现的。 自旋CAS实现的 基本思路 就是 循环 进行 CAS操作 直到成功为止。 CAS的三大问题 ABA问题 循环时间长开销大 只能保证一个共享变量的原子操作 来源: oschina 链接: https://my.oschina.net/qingjing/blog/4258671

2020最新Java工程师面试题-Java 并发编程(二)(附答案,持更中)

房东的猫 提交于 2020-04-29 17:11:20
1、并发编程三要素? 1、原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操 作打断,要么就全部都不执行。 2、可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他 线程可以立即看到修改的结果。 3、有序性 有序性,即程序的执行顺序按照代码的先后顺序来执行。 2、实现可见性的方法有哪些? synchronized 或者 Lock:保证同一个时刻只有一个线程获取锁执行代码,锁释放 之前把最新的值刷新到主内存,实现可见性。 3、多线程的价值? 1、发挥多核 CPU 的优势 多线程,可以真正发挥出多核 CPU 的优势来,达到充分利用 CPU 的目的,采用多 线程的方式去同时完成几件事情而不互相干扰。 2、防止阻塞 从程序运行效率的角度来看,单核 CPU 不但不会发挥出多线程的优势,反而会因 为在单核 CPU 上运行多线程导致线程上下文的切换,而降低程序整体的效率。但 是单核 CPU 我们还是要应用多线程,就是为了防止阻塞。试想,如果单核 CPU 使 用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未 返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。 多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数 据阻塞,也不会影响其它任务的执行. 具体内容篇幅较长共485页