本系列博客将和大家一起深入的探讨这些问题,主要介绍操作系统原理中的内存管理部分,从而让您更好的理解计算机。...每一个程序的运行都需要占用内存,每一个程序运行结束了以后,都会释放其占有的内存。这是大家首先需要了解的一个前提。 首先我们来给大家介绍下什么叫内存管理。...所谓内存管理简单来说就是你要运行一个程序,就需要给这个程序分配相应的内存,那么该如何分配这些内存呢? 可能有些同学说,这不是很简单的事情吗?...比如我有4G 的内存条,来了一个程序,我就给它多少的内存,这个程序运行结束了,我就回收这些内存,如下所示: ?...图3 某时刻内存分布情况 如下图是某时刻的内存分布,系统可用内存有下面绿色部分总共 256 + 256=512MB 的可用内存,但是这两块内存不是连在一起的。
在上一讲聊一聊内存管理(一)重点介绍了什么是内存管理,对内存管理有了整体的认识。简单来说就是,程序的运行需要内存,你如何管理并给这些程序分配内存。 本节介绍最简单的一种内存管理方案:单一连续区分配。...为什么说这种内存分配是最简单的呢?接下来做详细的介绍。 单一连续区内存分配的基本思想是一段时间内只有一个进程在内存。...将4G的内存分为两部分,一部分存放操作系统内核,另外一部分存放用户程序,且一段时间内只有一个用户程序在内存中。如图1-1所示: ?...图1 单一连续区内存分配 T1时刻有进程P1,需要512MB的内存,那么将内存分配给P1,如图1-2所示; T2时刻有进程P2,需要1GB的内存,由于单一连续区内存分配的特点,此时用户区已经有了P1在执行...但是缺点也非常明显: 一段时间内只能运行一个程序,因此无法实现多道程序; 在运行一个进程后,即使有足够的剩余内存也无法执行新的进程,而只有等待该进程运行结束后才能继续执行,因此内存的利用率相当的低; 如果进程所需的内存大于用户程序的总大小
代理模式 我们都知道java中有23种设计模式,今天我们就来聊一聊这23种设计模式中的代理设计模式,首先代理模式其实就是控制对其他对象的访问,在访问其他对象之前我们可以进行一些其他的操作。...智能代理(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作:记录对象的引用次数;当第一次引用一个对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其它对象不能改变它...Override public void showImage() { System.out.println("Real Image: " + imageURL); } } java...JDK中的动态代理 其实在jdk中的java.lang.reflect的包下就为我们内置了一种基与接口的动态代理模式proxy,其实这种动态代理模式也非常的好理解,我们用演员来举一个例子,演员出名了以后...** * 和粉丝吃饭 */ public void eat(); } java 有一个叫做FBB的演员实现了演员这个接口 public class FBB implements
这篇文章的标题叫做“再次认真聊一聊,Java or C++?”之所以叫再次,是因为大概在去年八月份的时候已经写过一篇文章聊了聊对于校招这块的语言选择,到底是选Java还是C++或者是Python?...我一个朋友在长沙一家小公司当HR,是个刚刚度过创业期的小公司,今年打算在校招中招5个Java校招生好好培养,结果直接收到了一万七千多份简历、、 因为学Java的人真的是太太太多了,学习Java的人会这么多...我从上学期初开始学Java(那会儿没想到之后Java这么卷),现在Java基础过了一遍,Java集合过了一遍(看过源码做过笔记,不过现在应该忘记了,要回去复习才行),也是用的Java刷的leetcode...另外互联网这边确实还是Java的岗多一些,比C++和Go都要多一些,即使大厂去不了,中厂也有不少Java厂,选择也会多一些,不要中途放弃才是真。...最初决定Java的原因是很多中小企业用Java,但是最近还是越来越感觉应该冲一冲,不能这么咸鱼,加上导师还是很放羊,除了因为盲审,可能对毕业论文有一些要求。所以时间还是有一些充裕。
一、声明和使用基本枚举 枚举可以被认为是一个密封类的语法糖,该类在编译时仅实例化了若干次,以定义一组常量。...import java.util.regex.Pattern; import java.util.function.Predicate; enum RegEx implements Predicate...("abc")); System.out.println(RegEx.NUMERIC.test("+111")); } } enum的每个成员也可以实现该方法: import java.util.function.Predicate...开箱即用的序列化 如实现接口一节所示,这个单例也可能实现一个或多个接口。...Enums.getIfPresent(DayOfWeek.class, "INVALID").or(defaultDay); assert day == DayOfWeek.SUNDAY; 总结 enum 类型提出给 JAVA
「本教程中, 我们将介绍使用 Java NIO 库实现这一点的各种方法。」 2....读锁的目的是防止另一个进程获取写锁。通常,处于一致状态的文件确实应该被任何进程读取。 在下一节中,我们将看到Java如何处理这些类型的锁。 3....Java中的文件锁 Java NIO库支持在操作系统级别锁定文件。FileChannel 中的lock() 和*tryLock()*方法就是为了这个而存在。.../io/RandomAccessFile.html#RandomAccessFile(java.io.File, java.lang.String)) 方法的第二个参数。...总结 在本教程中,我们回顾了在Java中获取文件锁的几种不同选项。 首先,我们首先了解两种主要的锁定机制,以及Java NIO库如何促进锁定文件。
今天我们来聊一聊Java中的线程池,首先来看看什么是线程池。 线程池就是以一个或多个线程(循环执行)多个应用逻辑的线程集合. 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。...提供一个示例: package thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors...下面给一个简单的自定义线程示例: package thread; import java.util.concurrent.*; public class ThreadPool { public...其实有一个很好的解决方法就是把submit()方法改为execute()即可,改了之后就会得到下面的结果: Exception in thread "pool-1-thread-1" java.lang.ArithmeticException...:624) at java.lang.Thread.run(Thread.java:748) 100.0 50.0 25.0 33.0 这也是submit()方法和execute()方法很重要的一个区别
不同于本地调用,函数与函数之间同属于同一块内存空间,如需调用某个函数,只需要找到所在内存地址即可。...文末我会给出一个简单的用 Java 实现 RPC 的 demo,这里先从一个有趣例子出发给出需要解决的三个问题:Call ID 映射、序列化和反序列化、网络传输。...但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用 C++,客户端用 Java 或者 Python)。...后面我们可以详细聊一聊这些序列化方式。 网络传输 不管采取什么样的序列化方式,最终目的都是为了方便传输,所有的数据都需要通过网络传输,因此 RPC 的实现就需要有一个网络传输层。...一个简单的RPC实现 为了直观的感受 RPC 通信,笔者实现了一个简易的 RPC 通信的 demo,开两个 terminal 分别执行 java -jar server-0.0.1-SNAPSHOT.jar
III)数据库限流;如果数据库实例对应单应用,可以不用限制,在上层就可以拦掉,但是如果一个数据库实例被多个应用共用就要考虑数据库限流,否则可能一个应用把数据库拖挂导致其他应用也崩溃了 所谓的限流...一、漏桶算法 ? 漏桶算法思路很简单,水(数据或者请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。...漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃,漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。...令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。...从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。
聊一聊灰度 ?...案例 小明家做食品批发生意,供应商向其推荐了一款新产品,并告诉他市场特别好,但是小明做了很多年生意,对于新产品线有自己的想法,他不愿意一下子就进很多新产品,因为有可能市场好大赚一笔, 也有可能市场不好砸在手里...灰度的目的是将产品面向一部分用户,如果试用结果反馈良好,再大量推广或者全量推广,如果反馈不好,可以回退到一个稳定可用的状态。...3 场景 按照灰度使用场景的不同,灰度可以分为灰度发布和灰度放量: 灰度发布 灰度发布,是将应用按照一定比例发布到指定的服务器上,然后应用服务集群就会出现有一部分集群运行1.0版本应用,...有一部分服务器运行2.0版本应用,这样请求过来后,会经过路由层路由到新版服务或者旧版服务。
最近无聊看了一下Go语言的面试八股文,发现面试官都喜欢问内存逃逸这个话题,这个激起了我的兴趣,我对内存逃逸的了解很浅,所以找了很多文章精读了一下,在这里做一个总结,方便日后查阅、学习。...什么是内存逃逸 初次看到这个话题,我是懵逼的,怎么还有内存逃逸,内存逃逸到底是干什么的?接下来我们一起来看看什么是内存逃逸。...,这样就会导致我们在写程序时如履薄冰,好处是我们可以完全掌控内存,缺点是我们一不小心就会导致内存泄漏,所以很多现代语言都有GC机制,Go就是一门带垃圾回收的语言,真正解放了我们程序员的双手,我们不需要在像写...说到这里,可以简单总结一下什么是内存逃逸了: 在一段程序中,每一个函数都会有自己的内存区域存放自己的局部变量、返回地址等,这些内存会由编译器在栈中进行分配,每一个函数都会分配一个栈桢,在函数运行结束后进行销毁...,就会导致程序访问非法内存,就像上面的C语言的例子一样,所以编译器经过逃逸分析后将其在堆上分配内存。
一:背景 1. 讲故事 在高级调试的旅程中,经常会有一些朋友问我什么是 工作集(内存),什么是 提交大小,什么是 Virtual Size, 什么是 Working Set 。。。...截图如下: 既然有很多朋友问,这些用口头也不怎么好描述,刚好上午有时间就系统的聊一下吧。 二:内存术语解读 1....Working Set 有些朋友可能知道,一个程序所占的内存最终会在三个地方落地: 物理内存条 虚拟内存 pagefile 物理文件 MappedFile 这里的 Workding Set 特指的就是...物理内存条 ,由于 Windows 有 MappedFile 这种文件映射(内存共享)机制,所以物理内存条上的内存可以进一步划分为 自己独占的 + 大家共享的,可能有些朋友比较蒙,截个图如下: 有了这张图的基础...为了方便演示出现了大量的换页内存,写一个不断灌数据的例子。
消息中间件中的顺序消息 什么是顺序消息 有了上述的基础之后,我们回到本篇文章的主题中,聊一聊消息中间件中的顺序消息。...而对于顺序消费,则需要保证哪些来自同一个发送线程的消息在消费时是按照相同的顺序被处理的(为什么不说他们应该在一个线程中被消费呢?)。...如何保证顺序 在MQ的模型中,顺序需要由3个阶段去保障: 消息被发送时保持顺序 消息被存储时保持和发送的顺序一致 消息被消费时保持和存储的顺序一致 发送时保持顺序意味着对于有顺序要求的消息,用户应该在同一个线程中采用同步的方式发送...存储保持和发送的顺序一致则要求在同一线程中被发送出来的消息A和B,存储时在空间上A一定在B之前。而消费保持和存储一致则要求消息A、B到达Consumer之后必须按照先A后B的顺序被处理。...文档只是给出了Producer顺序的处理,Consumer消费时通过一个分区只能有一个线程消费的方式来保证消息顺序,具体实现如下。
前前后后已经快写了2年左右javaScript,刚开始只是简单用于一些表单验证和操作dom节点,并没有深入的使用,随着渐渐的深入,开始不想去写重复的代码(懒的开始),从而写简单的继承,封装,抽象等等...Demo构造函数声明类 function Person(name){ this.name = name; } new生成实例 new生成实例的缺点:无法共享属性和方法,每次new新的实例会开辟新的内存空间...设计者很好的解决了这个问题,那么就是prototype属性(包含对象)的引入 prototype属性 它的好处是,实例一旦创建,将自动共同持有共享属性和方法,如: function Person(name...Person('小妞','女'); personB.show(); //小妞的国籍是是中国,性别:女 感觉似乎没有什么问题,但是personA和personB都包含有country、show属性方法一模一样的内容
栈大小 在了解协程栈之前,我们先看下传统的Linux进程内存布局: ?...栈扩容和缩容 在介绍具体的栈处理细节之前,我们先了解下协程栈的内存布局和一些重要的术语: ?...一些long running的goroutine可能由于某次函数调用中引发了栈的扩容, 被调用函数返回后很大部分空间都未被利用,为了解决这样的问题,需要能够对栈进行收缩,以节约内存提高利用率。...在一些对内存占用、延时敏感的服务中,要特别注意,否则将可能面临内存占用高、服务不稳定的状况。...上面介绍到栈缩容的目标是提高内存利用率,但在缩容过程中会存在栈拷贝和写屏障(write barrier),对于一些准实时应用可能会存在一些影响。
线程安全解决方式 Java提供了这么一些方式: 同步字Synchronization 并发包java.util.concurrent.atomic里面的原子类,例如AtomicInteger、AtomicBoolean...等 并发包java.util.concurrent.locks里面的锁,如ReentrantLock、ReadWriteLock 线程安全的集合类:ConcurrentHashMap、ConcurrentLinkedQueue...CAS 操作包含三个操作数 —— 内存位置(V)、期望的原值(A)和要修改的目标新值(B)。如果内存中位置的值和期望原值A一样,则更新为B;否则不操作。...version=version+1 where version=v 温馨提示:如果系统并发很高,数据库乐观锁可能导致大量事务回滚,很多线程白干活… ABA问题 CAS存在ABA问题:CAS是先拿到原值,在去和内存中指定位置的现值比较...volatile volatile关键字可以实现可见性(线程数据从主内存获取)、有序性(禁止指令重排)。
一、回溯算法回溯法(英语:backtracking)是暴力搜寻法中的一种。...是一种可以找出所有(或一部分)解的一般性算法回溯算法类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。...自顶向下是一个选择的过程,每一次在选择前需要判断是否已满足可选解,是否满足剪枝约束。 基于本问题的可行解判断条件就是 “当前已选择到的数据量是否和可选列表长度一致”。...每一次在选择到一个满足条件的的元素后,便向后继续选择,遇到不满足情况,撤销选择并 回溯到上一个位置。 如下:我们用一个切片 s := []int{} 来记录选择过程。...本题的思路是先以行为纬度,选择当前行合适的位置放置一个皇后,然后再下一行的每一列上寻找可以满足放置皇后的位置。
对于大多数机器来说,一个int所占的空间一般都是4Byte,那么用户A直接发一个4Byte的整形数据给用户B不就可以了吗? 事实真是如此吗?...(1) 假如用户A要发一个整数10给B,我们来分析一下这种情况。...解决方案 既然已经分析出问题所在了,那么有没有什么方法可以做到这一点呢? 设置每一个字节的最高位用作标志位,如果为1表示后面还有字节,如果为0表示这是最后一个字节,故每一个字节只有7位是有效的。...(1) 用户A发了一个字节给B: 0000 1010 用户B在收到第一个字节后,检查该字节的最高位,发现是0,表示这是最后一个字节,去掉最高位后,得到0001010再将二进制转化为十进制得到整数10。...结语 不同的整数所占的空间是不一样的,通过设计一种算法,使得每一个整数都使用自己需要的字节数,而不是统一的4个字节。
、鹏博士、万国数据等; 第三种属于自己有需求,但是嫌租房子太贵,干脆自己盖,一边可以自己用,一边还可以出租给别人,这就是互联网大厂,比如BAT、Facebook、微软等。...随着互联网的飞速发展,尤其是伴随着手机智能化带来的传输数据量的大增,整个IDC市场一直处于增长状态,年增速一度超过30%,2020年,在新基建政策的加持之下,国内IDC市场规模接近2000亿。 ?...在经历了十年高速发展后,数据中心产业并没有衰落的迹象,不过从数据上来看,从2015年到2019年,IDC市场的增速一直在放缓。除此之外,还有一个明显的变化是,互联网大厂亲自下场了。...究竟是什么吸引了互联网巨头也来分一杯羹? 从需求方面来看,5G的到来将进一步催生对于数据处理的需求,数据中心的建设需求将持续居高不下。...在过去的这些年里,数据中心的格局一直没有大的变化,随着5G、云计算、人工智能等新技术的发展,传统数据中心的弊端也逐渐暴露出来,再加上互联网巨头自建数据中心,尽管数据中心建设一直处于增长状态,但是第三方IDC
领取专属 10元无门槛券
手把手带您无忧上云