摘要: 文章也发布在 "听风过境的专栏" “free store” VS “heap” 当我问你C++的内存布局时,你大概会回答: “在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。 如果我接着问你自由存储区与堆有什么区别,你或许这样回答: “malloc在堆上分配的 阅读全文
posted @ 2015-12-20 15:20 melonstreet 阅读(33815) 评论(7) 推荐(45) 编辑
摘要: 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。 本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。 文章如果有解释不清、解释不通或疏漏的地方,恳请指出。 1.何为C++对象模型? 引用《深度 阅读全文
posted @ 2015-10-25 20:28 melonstreet 阅读(78644) 评论(55) 推荐(81) 编辑
摘要: 文章也发布在 "腾讯云+社区" 一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧)。最近花了点时间认真看了智能指针,特地来写这篇文章。 1.智能指针是什么 简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言 阅读全文
posted @ 2015-09-01 23:05 melonstreet 阅读(24641) 评论(11) 推荐(12) 编辑
摘要: [TOC] 上周在 "[分布式服务\]海量互联网服务设计的有损价值观" 这篇文章中提到,与金融行业服务要求的强一致性不同,海量互联网服务要求的是能够扛住更高的qps,服务降级研究的问题是在服务器资源有限的情况下,如何提供更大的访问量,并保证系统稳定运行。 最近我搬了个房子,房东还没来得及上面装宽带, 阅读全文
posted @ 2020-03-28 19:17 melonstreet 阅读(782) 评论(0) 推荐(3) 编辑
摘要: [toc] 互联网服务的有损价值观第一条是: 弱化绝对的一致性,保证最终一致性。 服务的可用性,是基于对数据进行多处的备份,也就是数据冗余来实现的。这也是最有效的一种手段。像银行账户这样的关键数据,银行的数据中心要遍布全球各地,即使地震火灾导致某个机房发生了物理性的数据毁坏,只要有数据备份,就可以保 阅读全文
posted @ 2020-03-17 01:57 melonstreet 阅读(592) 评论(0) 推荐(1) 编辑
摘要: 现在让你谈谈对Java平台的理解,你是否会感觉内容过于庞大?这个问题是比较宽泛的,Java发展到现在已经不仅仅是语言这么简单了,Java平台涉及的,包括但不仅限于下面提到的这些内容: Java语言本身,包括基础的语言特性,面向对象、放射、范型、lambda等等。 Java类库,包括核心类库如IO/N 阅读全文
posted @ 2019-02-16 11:07 melonstreet 阅读(1956) 评论(0) 推荐(1) 编辑
摘要: [TOC] 为什么需要保证幂等性 编程中的“幂等性”是指任意多次执行所产生的影响,与一次执行的影响相同。一个拥有幂等性设计的接口,保证无论一次或多次来调用接口,都能够得到相同的结果。接口的幂等性设计在某些场景下是必需的,例如用户下单的场景。 我们知道,服务之间的调用存在三种状态:成功、失败、超时。超 阅读全文
posted @ 2019-02-14 00:02 melonstreet 阅读(3366) 评论(0) 推荐(2) 编辑
摘要: 问题出现:现网CPU飙高,Full GC告警 CGI 服务发布到现网后,现网机器出现了Full GC告警,同时CPU飙高99%。在优先恢复现网服务正常后,开始着手定位Full GC的问题。在现场只能够抓到四个GC线程占用了很高的CPU,无法抓到引发Full GC的线程。查看了服务故障期间的错误日志, 阅读全文
posted @ 2018-09-14 17:26 melonstreet 阅读(2382) 评论(2) 推荐(7) 编辑
摘要: JVM的内存区域是怎么划分的? JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;有些区域会抛出OOM异常,有些则不会,了解JVM的内存区域划分以及特征,是定位线上内存问题的基础。那么JVM内存区域是怎么划分的呢? 首先是 程序计数器 (Program Counter Regi 阅读全文
posted @ 2018-09-12 18:00 melonstreet 阅读(3387) 评论(7) 推荐(0) 编辑
摘要: 并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问。加锁会带来性能上的损坏,似乎是众所周知的事情。然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程。如果只有一个线程竞争锁,此时并不存在多线程竞争的情况,那么JVM会进行优化,那么这时加锁带来的性能消耗 阅读全文
posted @ 2018-01-25 17:18 melonstreet 阅读(2511) 评论(3) 推荐(4) 编辑
摘要: 进行多线程编程的时候,需要考虑的是线程间的同步问题。对于共享的资源,需要进行互斥的访问。在Java中可以使用一些手段来达到线程同步的目的: 1. synchronized 2. ThreadLocal,线程本地变量 3. Java.util.concurrent.Lock Java中,线程会共享堆上 阅读全文
posted @ 2018-01-24 16:53 melonstreet 阅读(1797) 评论(1) 推荐(0) 编辑
摘要: Java的Object类包含了三个final方法,允许线程就资源的锁定状态进行通信。这三个方法分别是:wait(),notify(),notifyAll(),今天来了解一下这三个方法。在任何对象上调用这些方法的当前线程应具有对象监视器(锁住了一个对象,就是获得对象相关联的监视器),否则会抛出java 阅读全文
posted @ 2018-01-24 09:33 melonstreet 阅读(4456) 评论(1) 推荐(0) 编辑
摘要: 当你需要使用Java线程在多线程环境下进行编程时,理解Java的线程周期与线程的状态是非常重要的。通过实现Runnale接口或者继承Thread类,我们可以创建线程,为了启动一个线程,我们需要创建一个Thread对象,并且调用它的start()方法,以便以线程的方式来执行run()方法。 Java中 阅读全文
posted @ 2018-01-23 14:37 melonstreet 阅读(2584) 评论(0) 推荐(0) 编辑
摘要: Java的ThreadLocal变量用来创建线程本地变量。我们知道,一个对象上的所有线程,都会共享该对象的变量,所以这些共享的变量不是线程安全的。我们可以使用synchronization同步语法来使得线程安全,但如果想避免使用synchronization,那么可以使用线程本地变量(ThreadL 阅读全文
posted @ 2018-01-23 11:41 melonstreet 阅读(471) 评论(0) 推荐(0) 编辑
摘要: 题目 输出: 4 1 3 解释 1. 当函数有可命名结果形参时,结果形参的初始值被设置为零值,函数的return语句会设置结果形参的值 2. 当函数有可命名结果形参时,defer函数是可以修改它,然后再将它的值返回 DeferFunc1 和DeferFunc3是两个有命名结果形参的函数,结果形参的赋 阅读全文
posted @ 2017-10-12 15:42 melonstreet 阅读(1284) 评论(0) 推荐(0) 编辑
摘要: 本文的主要内容是: 了解goroutine,使用它来运行程序 了解Go是如何检测并修正竞争状态的(解决资源互斥访问的方式) 了解并使用通道chan来同步goroutine 一、使用goroutine来运行程序 1.Go的并发与并行 Go的并发能力,是指让某个函数独立于其他函数运行的能力。当为一个函数 阅读全文
posted @ 2017-10-01 00:14 melonstreet 阅读(3956) 评论(0) 推荐(1) 编辑
摘要: 一个在线的Go编译器 如果还没来得及安装Go环境,想体验一下Go语言,可以在 "Go在线编译器" 上运行Go程序。 格式化 让所有人都遵循一样的编码风格是一种理想,现在Go语言通过 ,让机器来处理大部分的格式化问题。 是go标准库提供的一段程序,可以尝试运行它,它会按照标准风格缩进,对齐,保留注释, 阅读全文
posted @ 2017-09-30 09:45 melonstreet 阅读(2633) 评论(1) 推荐(0) 编辑
摘要: 利用python写了一小段代码,里面使用到了Python标准库的 来构建一个基础HTTP服务器: 运行时抛出错误: 原因: http.server only exists in Python 3. In Python 2, you should use the BaseHTTPServer modu 阅读全文
posted @ 2017-04-27 15:40 melonstreet 阅读(13807) 评论(0) 推荐(0) 编辑
摘要: 如果你使用的是Linux发行版,例如Ubantu,那么你的系统中可能已经安装好python了。可以使用 来测试一下: 当然,这是我安装了Python3之后显示的。如果你测试出来你的系统安装的是Python 2.7或是提示command not found,想升级或安装Python3的话,可以使用如下 阅读全文
posted @ 2017-04-25 22:44 melonstreet 阅读(15107) 评论(0) 推荐(0) 编辑
摘要: 安装的ubuntu默认的编辑器是vi,遇到了两个问题: ① insert模式下,按方向键将产生A、B、C、D等字符,解决方案: :set nocompatible ② insert模式下Backspace键无法删除字符,解决方案: :set backspace=indent,eol,start 每次 阅读全文
posted @ 2017-04-05 19:31 melonstreet 阅读(4732) 评论(0) 推荐(0) 编辑
摘要: Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root 。 可以使用: sudo passwd 来重新设置root密码,后即可登陆root。 阅读全文
posted @ 2017-04-05 14:09 melonstreet 阅读(972) 评论(0) 推荐(0) 编辑
摘要: java尽力保证:所有变量在使用前都能得到恰当的初始化 ①函数/方法局部变量的初始化 在C/C++中,变量的初始化还是得依赖于程序员的自觉性。对于函数局部变量,编译器不会为基本类型赋予默认初始值,新手经常会使用未初始化的指针访问内存,导致程序崩溃。对于类对象,编译器将使用类的默认构造函数对对象进行初 阅读全文
posted @ 2017-03-16 16:56 melonstreet 阅读(1147) 评论(0) 推荐(0) 编辑
摘要: 0.前言 这些简单的shader程序都是写于2015年的暑假。当时实验室空调坏了,30多个人在实验室中挥汗如雨,闷热中学习shader的日子还历历在目。这些文章闲置在我个人博客中,一年将过,师弟也到了学shader的时候,这些例程虽然很简单,刚接触shader时却可以练练手,所以从个人博客中中搬了出 阅读全文
posted @ 2017-03-16 16:37 melonstreet 阅读(2594) 评论(0) 推荐(0) 编辑
摘要: 《java编程思想》 读书笔记 2017/3/15 读《java编程思想》读到初始化与清理一章,文中提及java的finalize()方法,联想到了C++的析构函数。finalize()方法与析构函数存在天然差别,这种差别源于语言本身机制的不同。 在C++中,对象是可以在栈上分配的,也可以在堆上分配 阅读全文
posted @ 2017-03-15 23:05 melonstreet 阅读(6083) 评论(0) 推荐(1) 编辑
摘要: 我使用过一个简单的后台服务框架.这个框架上手很容易,我只需要继承一个基类,同时实现,或重写(override)基类声明的几个接口(这些接口声明为虚函数,或者纯虚函数),然后调用基类定义好的run()函数,便可以将框架代码运行起来.run函数做的事情,是依序调用上述的几个接口: 其中收包,解包,回包, 阅读全文
posted @ 2017-03-11 17:03 melonstreet 阅读(1699) 评论(1) 推荐(0) 编辑
摘要: 操作系统接口 操作系统的任务是让多个程序共享计算机(资源),并且提供一系列基于计算机硬件的但更有用的服务。操作系统管理并且把底层的硬件抽象出来,举例来说,一个文字处理软件(例如word)不需要关心计算机使用的是哪种类型的磁盘。操作系统使得硬件可以多路复用,允许许多程序共同使用计算机并且在同一时间上运 阅读全文
posted @ 2016-05-31 11:11 melonstreet 阅读(742) 评论(0) 推荐(1) 编辑
摘要: ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的。这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的。TCP的发送方无法保证对等方每次接收到的是一个完整的数据包。主机A向主机B发送两个数据包,主机B的接收情况可能是 产生粘包 阅读全文
posted @ 2016-05-28 15:09 melonstreet 阅读(25323) 评论(4) 推荐(4) 编辑
摘要: 以良好的方式编写C++ class 假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯。 ① Header(头文件)中的防卫式声明 防止头文件的内容被多次包含。 ② 把数据放在private声明下,提供接口访问数据 ③ 不会改变类属性(数据成员)的成员函数,全部加上con 阅读全文
posted @ 2016-05-22 20:30 melonstreet 阅读(8138) 评论(15) 推荐(15) 编辑
摘要: 文件描述符 进程每打开一个文件的时候,会获得该文件的 文件描述符 ,而后续的读写操作都把文件描述符作为参数。在用户空间或者内核空间,都是通过文件描述符来唯一地索引一个打开的文件。文件描述符使用int类型表示,文件描述符的范围从0开始,到上限值 1,默认情况下,上限值为1024,也就是说,进程默认情况 阅读全文
posted @ 2016-05-08 18:20 melonstreet 阅读(3263) 评论(0) 推荐(3) 编辑
摘要: 1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译可以大大简化开发工作,避免不必要的重新编译。make工具通过一个称为Makefile的文件来完成并自 阅读全文
posted @ 2016-05-05 11:17 melonstreet 阅读(14304) 评论(0) 推荐(7) 编辑
摘要: 1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。 2. gcc的特点 gcc是一个 阅读全文
posted @ 2016-05-03 22:51 melonstreet 阅读(17910) 评论(4) 推荐(10) 编辑
摘要: SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程。在该例程序中,使用"Ctrl+c"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被告知: bind: Address already in use 原因在于服务器重新启动时需要绑定地址: 而这个时候网络 阅读全文
posted @ 2016-04-26 16:47 melonstreet 阅读(3887) 评论(0) 推荐(0) 编辑
摘要: 在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端 服务器模型的一个简单通信例程。该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端。 socket()函数 socket()函数用于创建一个套接字。这就好像购买了一个电话。不过该电话还没有分配号码。 参数 阅读全文
posted @ 2016-04-25 21:14 melonstreet 阅读(2068) 评论(0) 推荐(2) 编辑
摘要:  1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口。TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间。用户空间的程序需要通过套接字来访问内核网络协议栈。 套接口是全双工的通信,它不仅可以用于本机的进程间通信,还可以用于 阅读全文
posted @ 2016-04-24 11:46 melonstreet 阅读(1765) 评论(0) 推荐(1) 编辑
摘要: 0. 数据结构图文解析系列 |数据结构系列文章| |: | | "数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现" | | "数据结构图文解析之:栈的简介及C++模板实现" | | "数据结构图文解析之:队列详解与C++模板实现" | | "数据结构图文解析之:树的简介及二叉排序树C+ 阅读全文
posted @ 2016-02-17 16:55 melonstreet 阅读(7833) 评论(1) 推荐(3) 编辑
摘要: 0. 数据结构图文解析系列 |数据结构系列文章| |: | | "数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现" | | "数据结构图文解析之:栈的简介及C++模板实现" | | "数据结构图文解析之:队列详解与C++模板实现" | | "数据结构图文解析之:树的简介及二叉排序树C+ 阅读全文
posted @ 2016-02-17 10:43 melonstreet 阅读(9116) 评论(0) 推荐(1) 编辑
摘要: 0.前言 这篇文章写于去年的暑假。大二的假期时间多,小组便开发一个手机游戏的项目,开发过程中忙里偷闲地了解了Unity的shader编写,而CG又与shaderLab相似,所以又阅读了《CG教程》、《GPU 编程与CG 语言之阳春白雪下里巴人》学习图形学的基础。尝试编写unity shader时还恶 阅读全文
posted @ 2016-02-15 11:36 melonstreet 阅读(6384) 评论(2) 推荐(5) 编辑
摘要: C++11标准在标准库中为多线程提供了组件,这意味着使用C++编写与平台无关的多线程程序成为可能,而C++程序的可移植性也得到了有力的保证。另外,并发编程可提高应用的性能,这对对性能锱铢必较的C++程序员来说是值得关注的。 1. 何为并发 并发 指的是两个或多个独立的活动在 同一时段 内发生。生活中 阅读全文
posted @ 2016-02-12 22:54 melonstreet 阅读(3426) 评论(0) 推荐(6) 编辑
摘要: 0. 数据结构图文解析系列 |数据结构系列文章| |: | | "数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现" | | "数据结构图文解析之:栈的简介及C++模板实现" | | "数据结构图文解析之:队列详解与C++模板实现" | | "数据结构图文解析之:树的简介及二叉排序树C+ 阅读全文
posted @ 2016-02-11 15:32 melonstreet 阅读(16628) 评论(13) 推荐(11) 编辑
摘要: 0. 数据结构图文解析系列 |数据结构系列文章| |: | | "数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现" | | "数据结构图文解析之:栈的简介及C++模板实现" | | "数据结构图文解析之:队列详解与C++模板实现" | | "数据结构图文解析之:树的简介及二叉排序树C+ 阅读全文
posted @ 2016-02-05 22:59 melonstreet 阅读(6060) 评论(0) 推荐(6) 编辑
摘要: 0. 数据结构图文解析系列 |数据结构系列文章| |: | | "数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现" | | "数据结构图文解析之:栈的简介及C++模板实现" | | "数据结构图文解析之:队列详解与C++模板实现" | | "数据结构图文解析之:树的简介及二叉排序树C+ 阅读全文
posted @ 2016-02-04 00:57 melonstreet 阅读(16185) 评论(3) 推荐(5) 编辑
摘要: 0. 数据结构图文解析系列 |数据结构系列文章| |: | | "数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现" | | "数据结构图文解析之:栈的简介及C++模板实现" | | "数据结构图文解析之:队列详解与C++模板实现" | | "数据结构图文解析之:树的简介及二叉排序树C+ 阅读全文
posted @ 2016-02-03 08:38 melonstreet 阅读(18846) 评论(0) 推荐(9) 编辑
摘要: 0. 数据结构图文解析系列 |数据结构系列文章| |: | | "数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现" | | "数据结构图文解析之:栈的简介及C++模板实现" | | "数据结构图文解析之:队列详解与C++模板实现" | | "数据结构图文解析之:树的简介及二叉排序树C+ 阅读全文
posted @ 2016-02-02 07:42 melonstreet 阅读(33412) 评论(3) 推荐(12) 编辑