memory

ActiveMQ memory consumption through the roof (page file)… what to do?

北城余情 提交于 2020-01-24 12:12:08
问题 We're using an older version of ActiveMQ (5.3.2) (see: Is activemq reliable?) We've removed persistence because we needed more speed. Our worker can keep up with the messages, but, even though the queue typically is at 0 pending, after about 45000 messages processed (a message is typically 100 chars long), the Page file is 8GB!! It doesn't stop there though, it continues until 15 GB is reached (Our server has 16gb memory)! Stopping the ActiveMQ process doesn't clean up this pagefile, it

Why is program counter incremented by 1 if memory organised as word and by 2 in case of bytes?

こ雲淡風輕ζ 提交于 2020-01-24 10:34:06
问题 If in a computer an instruction is of 16 bits and if memory is organized as 16-bits words, then the address of the next instruction is evaluated by adding one in the address of the current instruction. In case, the memory is organized as bytes, which can be addressed individually, then we need to add two in the current instruction address to get the address of the next instruction to be executed in sequence. Why is it so?? Please explain this concept. I am new to computer organisation and

Objective-C中的Block

大憨熊 提交于 2020-01-24 09:50:27
来源: 伯乐在线 - 青玉伏案 链接:http://ios.jobbole.com/83229/ 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西。学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也支持闭包, 也就是OC中所提到的Block。 到底什么是闭包或者block呢?用大白话说就是匿名函数,也就是在函数中可以包含这函数。就是在函数中可以定义匿名函数然后在函数中调用。学习OC中的block之前也小担心一下,Block在OC中属于高级的部分,心里有又有个疑问:学起来难不难?看过Block的部分,感觉Block挺好理解的,用起来也挺顺手的,Block没我想象中的那么难理解。 废话少说,学习一门新的编程语言是少不了代码量的支持的,所以代码是少不了的。下面就通代码来认识一下OC中的block的使用。 Block基础部分 1.Block的声明 Block的定义和函数的声明差不多,就是把函数名改成(^blockName)即可。下面是block声明的代码。 有返回值的 int ( ^ sumBlock ) ( int , int ); 无返回值的 void ( ^ myBlock )( int , int ); 2.给block块赋值 给声明好的block,赋值。block的值就是个函数体

Calling delegate method, unrecognized selector because sending to wrong object

僤鯓⒐⒋嵵緔 提交于 2020-01-24 05:47:27
问题 In my app I do a lot of network loading. My data model consists of "Loader" objects that do this loading and call their delegate when finished/failed. The delegates all conform to a "LoaderDelegate" protocol. The issue I'm having is that sometimes seemingly random objects, not the delegate, are getting the delegate messages. This of course causes a crash because of an unrecognized selector. Only one set of crash logs tell me which one of my loaders is having the issue, the others don't have

C++ 原子操作和内存模型

故事扮演 提交于 2020-01-24 04:34:02
最近有一个困扰我的问题:如何使 C++ 的原子变量高效而且可移植? 我知道 Java volatile 是怎么工作的——它强制实行顺序一致性( sequential consistency ),但是这个方法并不总是效率最高的。 C++0x 原子变量在默认模式下也一样强制实施顺序一致性。如果没有特别的顺序注记( annotation ),它们和 Java volatile 几乎一模一样(有趣的是, Java 的 volatile 并不强制原子性——尽管有个 atomic library 来实现这一点)。 但是 C++ 可以在不同程度上放松顺序一致性的限制,如果使用得当的话,将会产生效率更高的代码。 在学习了一些 x86 的内存模型的知识后,我认识到一些基本的 lock-free pattern 无锁编程模式(比如我在 double-checked locking 重复检查锁模式中就发现了一种)可以直接运行而无需任何栅障同步( fence )。我们需要一种 C++ 编程思路,当编译成 x86 代码时,不产生栅障,而在编译成 alpha 或 Power PC 这样的非 x86 代码时,产生需要的栅障。 让事情更加有趣的是,一些其他的算法,如 Peterson 锁,在 x86 上还是需要内存栅障(请看我之前的 blog )。所以也不是简单的取消所有栅障就能搞定的。 我将我的问题缩短成

内存模型

你说的曾经没有我的故事 提交于 2020-01-24 03:52:45
在 C++11 标准中,一个重大的更新就是引入了 C++ 多线程内存模型。本文的主要目的在于介绍 C++ 多线程内存模型涉及到的一些原理和概念,以帮助大家理解 C++ 多线程内存模型的作用和意义。 1. 顺序一致性模型 (Sequential Consistency) 在介绍 C++ 多线程模型之前,让我们先介绍一下最基本的顺序一致性模型。对多线程程序来说,最直观,最容易被理解的执行方式就是顺序一致性模型。顺序一致性的提出者 Lamport 给出的定义是: “… the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program.” 从这个定义中我们可以看出,顺序一致性主要约定了两件事情: (1). 从单个线程的角度来看,每个线程内部的指令都是按照程序规定的顺序 (program order) 来执行的 ; (2). 从整个多线程程序的角度来看

c++11 内存模型解读

主宰稳场 提交于 2020-01-24 03:48:55
c++11 内存模型解读 关于乱序 说到内存模型,首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序通常并不是总按着照源码中的顺序一一执行,此谓之乱序,乱序产生的原因可能有好几种: 编译器出于优化的目的,在编译阶段将源码的顺序进行交换。 程序执行期间,指令流水被 cpu 乱序执行。 inherent cache 的分层及刷新策略使得有时候某些写读操作的从效果上看,顺序被重排。 以上乱序现象虽然来源不同,但从源码的角度,对上层应用程序来说,他们的效果其实相同:写出来的代码与最后被执行的代码是不一致的。这个事实可能会让人很惊讶:有这样严重的问题,还怎么写得出正确的代码?这担忧是多余的了,乱序的现象虽然普遍存在,但它们都有很重要的一个共同点:在单线程执行的情况下,乱序执行与不乱序执行,最后都会得出相同的结果 (both end up with the same observable result), 这是乱序被允许出现所需要遵循的首要原则,也是为什么乱序虽然一直存在但却多数程序员大部分时间都感觉不到的根本原因。 乱序的出现说到底是编译器,CPU 等为了让你程序跑得更快而作出无限努力的结果,程序员们应该为它们的良苦用心抹一把泪。 从乱序的种类来看,乱序主要可以分为如下4种: 写写乱序(store store), 前面的写操作被放到了后面的操作之后,比如: a = 3; b = 4;

C++11内存模型的粗略解释

主宰稳场 提交于 2020-01-24 03:40:38
基本解释 C++11引入了多线程,同时也引入了一套内存模型。从而提供了比较完善的一套多线程体系。在单线程时代,一切都很简单。没有共享数据,没有乱序执行,所有的指令的执行都是按照预定的时间线。但是也正是因为这个强的同步关系,给CPU提供的优化程度也就相对低了很多。无法体现当今多核CPU的性能。因此需要弱化这个强的同步关系,来增加CPU的性能优化。 C++11提供了6种内存模型: 1 enum memory_order{ 2 memory_order_relaxed, 3 memory_order_consume, 4 memory_order_acquire, 5 memory_order_release, 6 memory_order_acq_rel, 7 memory_order_seq_cst 8 } 原子类型的操作可以指定上述6种模型的中的一种,用来控制同步以及对执行序列的约束。从而也引起两个重要的问题: 1.哪些原子类型操作需要使用内存模型? 2.内存模型定义了那些同步语义(synchronization )和执行序列约束(ordering constraints)? 原子操作可分为3大类: 读操作: memory_order_acquire, memory_order_consume 写操作: memory_order_release 读-修改-写操作: memory

C++ 11 多线程初探-std::memory_order

邮差的信 提交于 2020-01-24 03:35:38
  std::memory_order(可译为内存序,访存顺序)   动态内存模型可理解为存储一致性模型,主要是从行为(behavioral)方面来看多个线程对同一个对象同时(读写)操作时(concurrency)所做的约束,动态内存模型理解起来稍微复杂一些,涉及了内存,Cache,CPU 各个层次的交互,尤其是在共享存储系统中,为了保证程序执行的正确性,就需要对访存事件施加严格的限制。   假设存在两个共享变量a, b,初始值均为 0,两个线程运行不同的指令,如下表格所示,线程 1 设置 a 的值为 1,然后设置 R1 的值为 b,线程 2 设置 b 的值为 2,并设置 R2 的值为 a,请问在不加任何锁或者其他同步措施的情况下,R1,R2 的最终结 果会是多少? 由于没有施加任何同步限制,两个线程将会交织执行,但交织执行时指令不发生重排,即线程 1 中的 a = 1 始终在 R1 = b 之前执行,而线程 2 中的 b = 2 始终在 R2 = a 之前执行 ,因此可能的执行序列共有 4!/(2!*2!) = 6 种   多线程环境下顺序一致性包括两个方面,(1). 从多个线程平行角度来看,程序最终的执行结果相当于多个线程某种交织执行的结果,(2)从单个线程内部执行顺序来看,该线程中的指令是按照程序事先已规定的顺序执行的(即不考虑运行时 CPU 乱序执行和 Memory

How is memory managed for non-declared entities in the C language?

三世轮回 提交于 2020-01-24 02:52:06
问题 For example: In the following code, how and where is the number '10' used for the comparison stored? #include<stdio.h> #include<conio.h> int main() { int x = 5; if (x > 10) printf("X is greater than 10"); else if (x < 10) printf("X is lesser than 10"); else printf("x = 10"); getch(); return 0; } Pardon me for not giving enough details. Instead of initializing 'x' directly with '5', if we scan and get it from the user we know how memory is allocated for 'x'. But how memory is allocated for the