运存

项目运行过程中重启

倖福魔咒の 提交于 2020-01-21 09:36:14
背景:项目中定时处理数据时项目重启或者项目停止运行 原因:经检查发现是由于处理数据量过大导致内存不够用引起了项目的重启或者停止运行,内存使用量随着数据的处理过程持续增大,即使数据处理完毕后内存也没能释放。 内存增长截图如下 解决方案:由于部署环境最大内存只能分配8个G,目前想到的办法只能硬编码实现释放内存 采用了调用Runtime.getRuntime().gc();方法呼叫java虚拟机的垃圾回收器运行回收内存的垃圾以保证尽快的腾出可用的内存,如下为使用了Runtime.getRuntime.gc()后 当调用Runtime.getRuntime().gc();方法后系统运行垃圾回收器,调用gc()方法来建议JVM努力回收没有使用的对象内存,为了使它们占用的内存腾出来让别的对象快速使用。当调用完该方法后,JVM会尽它最大努力从所有不再使用(销毁)的对象中回收内存空间。 弊端:如果项目中还有其他服务在运行,调用gc()方法会导致正在运行的服务被暂停,故如果项目中此时还存 在服务在运行时不能调用gc()方法,此处调用gc()方法是因为项目中除了定时器触发运行的任务外无其他服务在运行,故影响不大。 当然最好的方法还是不要使用Runtime.getRuntime().gc(),但未能找到更好的办法,希望能有更好的解决办法 上述仅代表个人观点 来源: CSDN 作者: weixin

栈与堆

纵饮孤独 提交于 2020-01-17 05:30:42
栈是编译期间就分配好的内存空间,因此代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中 堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小 #region a->b->c->d 输出 d,c,b,a string[] names = new string[] { "a", "b", "c", "d" }; Stack stack = new Stack(); foreach (string item in names) { stack.Push(item); } while (stack.Count > 0) { Console.WriteLine(stack.Pop()); } #endregion 来源: https://www.cnblogs.com/xiaoweigogo/p/7799925.html

嵌入式面试题

让人想犯罪 __ 提交于 2020-01-17 03:31:27
参考链接: 看你会多少 记一次嵌入式底层面试 Linux面试基础题3道 一、请问uboot启动过程都做了些什么? 1、cpu刚开始初始化的时候,还未设置栈,所以先使用汇编代码,构建异常项链表,然后设置cpu为svc(特权)模式,同时关闭FIQ和IRQ(防止突发中断程序跑飞了) 注:在跳转到内核之前,要满足CPU出在SVC模式下。 2、对cp15协处理器进行设置,这里主要是关闭MMU和cache 3、进入到板级初始化阶段,这里会进行时钟、内存、串口的初始化。最后还要关闭看门狗。 4、接下来就是设置栈,为c语言准备运行环境,调用board_init_f,填充gd结构体。 5、对代码重定位,搬运到内存中去,搬运之后,跳转到内存中去执行board_init_r,这里就可以开启cache了,当然也可以不开启。然后初始化其他设备。比如flash、网卡、emmc等。初始化完之后,在执行main_loop 二、为什么uboot要关掉cache? uboot要关掉cache 根据cache的定位可以看出来,它是用来加快cpu从内存中取出指令的速度,但我们都知道,在设备上电之初,我们的内存初始化比较慢一拍,当cpu初始化了,但内存还没准备好之后,就对内存进行数据读,那么势必会造成了指令取址异常,系统就会挂了。所以,在u-boot的上电之初,就得关闭掉数据cache

运行内存数据加密加密

匆匆过客 提交于 2020-01-14 13:11:50
前言 对于单机游戏,或者客户端跑游戏逻辑且服务器不验证的网游,需要一些反作弊手段。 内存数据加密, 游戏数据合理性检测, 服务器重跑验证等都是有效的方案。 本文主介绍内存数据加密。 正文 内存修改器原理: 修改器修改的数值都是在内存中常驻的,也就是说,数值在内存中的地址是不变的。 我们通过一个例子来看修改器的基本流程。 比如游戏内金币为100, 修改器先搜100,会得到值为100的变量内存地址。 等金币变200后,再搜200。 一般重复3到4步操作,修改器就能定位到金币这个变量所在的内存地址。 接着就是修改。 在基本搜索之外,一些强大的修改器还提供了模糊搜索和反加密搜索。 模糊搜索 : 一些类似于血条等看不到具体数字的数值,模糊搜索提供了搜索“变大”、“变小”、“变化了”、“没变化”等操作,进行内存筛选。 模糊搜索的步骤比直接搜数值要多,一般要重复7到10步操作才能找到变量对应的内存地址。 反加密搜索 : 顾名思义,当数值经过加密后存放到内存中时,需要反加密才能找到内存地址。一般都是简单的异或加密或者倍值加密公式。 如何进行内存加密 内存加密一般分为可逆加密和不可逆加密 可逆加密 : 显示的数据 ~= 内存的数据。 将内存中常驻的数据加密起来,在显示的时候解密即可。 例如简单的异或加密或者y = nx + m。 有兴趣的可以搜索一些复杂的加密算法。 不可逆加密: 显示的数据 ==

104 操作系统的发展史

▼魔方 西西 提交于 2020-01-10 17:56:24
一、第一代计算机(1946年) 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。 利用真空管和插线板 真空管在我们运行操作计算机的时候容易烧掉,就是破损掉 采用手工操做——穿孔卡片 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。 手工操作方式两个特点: 用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。 CPU 等待手工操作。CPU的利用不充分。 工作过程: 程序员在墙上的机时表预约一段时间,然后程序员拿着他的插件版到机房里,将自己的插件板街道计算机里,这几个小时内他独享整个计算机资源,后面的一批人都得等着(两万多个真空管经常会有被烧坏的情况出现)。 后来出现了穿孔卡片,可以将程序写在卡片上,然后读入机而不用插件板 优点: 程序员在申请的时间段内独享整个资源,可以即时地调试自己的程序(有bug可以立刻处理) 缺点: 浪费计算机资源,一个时间段内只有一个人用。 注意:同一时刻只有一个程序在内存中,被cpu调用执行,比方说10个程序的执行,是串行的 注意: 20世纪50年代后期,出现 人机矛盾 。

方法

℡╲_俬逩灬. 提交于 2020-01-07 05:26:01
方法的内存分析 https://www.bilibili.com/video/av33686176?p=87 return 当返回值是void的时候return后面必须直接写分号 运行到return方法终止 参数 实参 形参 形参也属于局部变量 调用方法内存分析 方法重载 在同一个类中方法名相同, 参数列表 不同。(与返回类型无关)[] 来源: https://www.cnblogs.com/huochemeiyouhuo/p/12149633.html

曹大谈内存重排

淺唱寂寞╮ 提交于 2020-01-05 03:38:18
目录 什么是内存重排 CPU 重排 编译器重排 为什么要内存重排 内存重排的底层原理 总结 参考资料 写这篇文章的原因很简单,公司内部的 Golang 社区组织了第一期分享,主讲嘉宾就是我们敬爱的曹大。这个必定是要去听的,只是曹大的讲题非常硬核,所以提前找他要了参考资料,花了 1 个小时提前预习,才不至于在正式分享的时候什么也不懂。当然了,这也是对自己和主讲者的尊重。所有的参考资料都在文章最后一部分,欢迎自行探索。 在我读曹大给我的中英文参考资料时,我发现英文的我能读懂,读中文却很费劲。经过对比,我发现,英文文章是由一个例子引入,循序渐进,逐步深入。跟着作者的脚步探索,非常有意思。而中文的博客上来就直奔主题,对于第一次接触的人非常不友好。 两者就像演绎法和归纳法区别。国内的教材通常是演绎法,也就是上来先讲各种概念、原理,再推出另一些定理,比较枯燥;国外的教材更喜欢由例子引入,步步深入,引人入胜。这里,不去评判孰孰劣。多看看一些英文原版材料,总是有益的。据我所知,曹大经常从亚马逊上购买英文书籍,这个侧面也可以反映曹大的水平高啊。据说英文书一般都很贵,可见曹大也是很有钱的。 所以啊,技术文章写好不容易,我也自省一下。 什么是内存重排 分两种,硬件和软件层面的,包括 CPU 重排、编译器重排。 CPU 重排 引用参考资料 【内存一致模型】 里的例子: 在两个线程里同时执行上面的代码,A

FLASH和EEPROM的最大区别

隐身守侯 提交于 2020-01-05 02:53:53
FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。 至于那个“总工”说的话如果不是张一刀记错了的话,那是连基本概念都不对,只能说那个“总工”不但根本不懂芯片设计,就连MCU系统的基本结构都没掌握。在芯片的内电路中,FLASH和EEPROM不仅电路不同,地址空间也不同,操作方法和指令自然也不同,不论冯诺伊曼结构还是哈佛结构都是这样。技术上,程序存储器和非易失数据存储器都可以只用FALSH结构或EEPROM结构,甚至可以用“变通”的技术手段在程序存储区模拟“数据存储区”,但就算如此,概念上二者依然不同,这是基本常识问题。 没有严谨的工作精神,根本无法成为真正的技术高手。 现在的单片机,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据. 楼 上说的很好 另外,一些变量

如何突破.NET内存限制?

拜拜、爱过 提交于 2020-01-01 03:27:32
我们现在的一个.NET应用程序需要用到2G左右的内存,当我们将这个程序放到有4G内存的服务器上运行时,就会抛出OutOfMemory异常。 为了搞清楚抛出异常的原因,我写了个用于申请内存的测试程序,每次申请100M。运行这个测试程序,发现每次申请到1.2G时就会抛出OutOfMemory异常。 我在网上找到了一篇文章,告诉如何突破1.2G内存: http://www.xker.com/page/e2007/0116/12771.html 其中的重点摘抄如下: (1)在boot.ini文件中增加/3GB的开关。 [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(2)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB (2)在命令行窗口,进入该目录,如 cd "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin" (3)运行link命令: link -edit -LARGEADDRESSAWARE server.exe (server.exe为你的.Net程序) (4)你的server.exe就可以使用到2.4G内存了

Linux服务器性能查看分析调优

℡╲_俬逩灬. 提交于 2019-12-31 01:27:27
一 linux服务器性能查看 1.1 cpu性能查看 1、查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l 2、查看每个物理cpu中的core个数: cat /proc/cpuinfo |grep "cpu cores"|wc -l 3、逻辑cpu的个数: cat /proc/cpuinfo |grep "processor"|wc -l 物理cpu个数*核数=逻辑cpu个数(不支持超线程技术的情况下) 1.2 内存查看 1、查看内存使用情况: #free -m total used free shared buffers cached Mem: 3949 2519 1430 0 189 1619 -/+ buffers/cache: 710 3239 Swap: 3576 0 3576 total:内存总数 used:已经使用的内存数 free:空闲内存数 shared:多个进程共享的内存总额 - buffers/cache:(已用)的内存数,即used-buffers-cached + buffers/cache:(可用)的内存数,即free+buffers+cached Buffer Cache用于针对磁盘块的读写; Page Cache用于针对文件inode的读写,这些Cache能有效地缩短I