物理内存

JVM调优

匿名 (未验证) 提交于 2019-12-03 00:26:01
JVM参数: 参数名称 含义 默认值 -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. -Xmx 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 -Xmn 年轻代大小(1.4or lator) 注意 :此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小. 增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 -XX:NewSize 设置年轻代大小(for 1.3/1.4) -XX:MaxNewSize 年轻代最大值(for 1.3/1.4) -XX:PermSize 设置持久代(perm gen)初始值 物理内存的1/64 -XX:MaxPermSize 设置持久代最大值 物理内存的1/4 -Xss 每个线程的堆栈大小 JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程

解Bug之路:记一次JVM堆外内存泄露Bug的查找

匿名 (未验证) 提交于 2019-12-03 00:19:01
行业前列 百家号 01-15 16:30 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。 由于物理内存定量分析部分用到了linux kernel虚拟内存管理的知识,读者如果有兴趣了解请看ulk3(《深入理解linux内核第三版》) 内存泄露Bug现场 一个线上稳定运行了三年的系统,从物理机迁移到docker环境后,运行了一段时间,突然被监控系统发出了某些实例不可用的报警。所幸有负载均衡,可以自动下掉节点,如下图所示: 登录到对应机器上后,发现由于内存占用太大,触发OOM,然后被linux系统本身给kill了。 应急措施 紧急在出问题的实例上再次启动应用,启动后,内存占用正常,一切Okay。 奇怪现象 当前设置的最大堆内存是1792M,如下所示: -Xmx1792m -Xms1792m -Xmn900m -XX:PermSize=256m -XX:MaxPermSize=256m -server -Xss512k 查看操作系统层面的监控,发现内存占用情况如下图所示: 上图蓝色的线表示总的内存使用量,发现一直涨到了4G后,超出了系统限制。 很明显,有堆外内存泄露了。 查找线索 gc日志 一般出现内存泄露,笔者立马想到的就是查看当时的gc日志。

转:Tomcat 内存溢出 \&quot;OutOfMemoryError\&quot; 问题总结 (JVM参数说明)

匿名 (未验证) 提交于 2019-12-03 00:12:02
问题说明: 公司内网环境中部署的jenkins代码发版平台突然不能访问了,查看tomcat的catalina.out日志发现报错如下: ? 1 2 3 4 5 6 [root@redmine logs] # tail -f /srv/apache-tomcat-7.0.67/logs/catalina.out ...... Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space ...... 上面报错是由于tomcat内存溢出引起的: ? 1 2 3 [root@redmine logs] # ps -ef|grep tomcat /usr/java/jdk1 .7.0_79 /bin/java -Djava.util.logging.config. file = /srv/apache-tomcat-7 .0.67 /conf

如何用C#实时获取CPU利用率

匿名 (未验证) 提交于 2019-12-03 00:05:01
获取内存使用率 方式1: using System; using System.Runtime.InteropServices; namespace ConsoleApp1 { public class Class1 { static void Main(string[] args) { Console.WriteLine("总内存:" + FormatSize(GetTotalPhys())); Console.WriteLine("已使用:" + FormatSize(GetUsedPhys())); Console.WriteLine("可使用:" + FormatSize(GetAvailPhys())); Console.ReadKey(); } #region 获得内存信息API [DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GlobalMemoryStatusEx(ref MEMORY_INFO mi); //定义内存的信息结构 [StructLayout(LayoutKind.Sequential)] public struct MEMORY_INFO { public uint dwLength; //当前结构体大小

jvm参数调优

匿名 (未验证) 提交于 2019-12-03 00:01:01
Jvm常用参数 --------------------------------------- 堆内存 = 年轻代+老年代 年轻代 = Eden+Survivor Survivor = From Space+To Space --------------------------------------- 年轻代 = Eden+From Space+To Space 堆内存=Eden+From Space+To Space+老年代 ==================================== -Xms2048m,初始堆大小,建议<物理内存的1/4,默认值为物理内存的1/64---- -Xmx2048m,最大堆大小,建议与-Xms保持一致,默认值为物理内存的1/4 -Xmn512m,新生代大小,建议不超过堆内存的1/2 -Xss256k,线程堆栈大小,建议256k -XX:PermSize=256m,永久代初始值,默认值为物理内存的1/64 -XX:MaxPermSize=256m,永久代最大值,默认值为物理内存的1/4 -XX:SurvivorRatio=8:年轻带中Eden区和Survivor区的比例,默认为8:1,即Eden(8),From Space(1),ToSpace(1) -XX:MaxTenuringThreshold=15:晋升到老年代的对象年龄

内存管理

匿名 (未验证) 提交于 2019-12-02 23:57:01
为了让每个进程认为 独占 地使用内存,并且让每个进程看到的内存是 一致 的,操作系统对物理内存、磁盘进行了 抽象 ,抽象出 虚拟内存 。并且把虚拟内存、物理内存以相同固定大小的 ҳ 进行切分管理( 分页 ),虚拟内存中叫页,物理内存中的叫页帧。 每个进程虚拟地址空间是独立的。用户访问的是虚拟内存的地址,即虚拟地址。需要通过 CPU 芯片上的 内存管理单元 MMU 硬件根据页表 翻译 成物理地址,才能真正访问内存。 页表 :每个进程都有它的独立的页表(放在内存里),用来存对虚拟页、物理页的 映射 。页表可以有多级页表,以时间换取空间(实际上,多级页表的地址翻译,并不比单级页表慢很多)。 如果直接按一个个程序加载到内存,会出现内存 碎片 。 后来出现 分段 机制,按程序的各段来存储,从而减少碎片,但是还是有很多。 所以引出分页,把程序分成更小的页(一般大小为 4KB )来管理内存。分得更小,会增加负荷,但实际上利大于弊。 通过虚拟地址 访问 数据: MMU 先通过它里面的 TLB 缓存查询,如果没有,则去内存中的 页表 进行查询。成功翻译成物理地址后,访问 一级缓存 获取数据。如果没有则访问 二级缓存 (可能还有三级缓存)。还是没有就访问 内存 。 物理内存 不够 时: 将不用的页面换出到磁盘中的 swap 分区 里。 包含: 程序代码和静态变量(根据可执行文件进行初始化,并固定了大小

ucore Lab2 实验笔记

匿名 (未验证) 提交于 2019-12-02 23:57:01
ucore Lab2 lab 2 直接执行 make qemu-nox 会显示 assert 失败: kernel panic at kern/mm/default_pmm.c:277: assertion failed: (p0 = alloc_page()) == p2 - 1 对物理内存的管理,为了节省空间,也是为了配合接下来的虚拟内存管理,通常以某个比 byte 大一些的单位进行管理,我们称这一单位内存为一" ҳ(page) ",通常是 4KB.待 pages 初始化完毕后,物理内存示意图如下: 其中绿色代表可以分配的内存,红色代表不可被分配的内存.注意, ucore 规定物理内存可用范围最大不超过 KERNSIZE .函数 page_init 的主要作用就是初始化 pages 也就是所有 page 的所有信息. 注意, pages 以全局指针的形式存在,因为最开始无法知道 page 的数量,所以无法写成数量确定的数组.此数量必须尽快确认,否则后期无法管理. 如何确定 page 的数量 npage 呢? npages 可由最大物理内存边界/PGSIZE 得出. 而最大物理内存边界可以借助 BIOS 可以探测并计算出来,参考 探测系统物理内存布局 和 实现物理内存探测 .可以获取到最大可用物理内存边界 maxpa , 但 maxpa 最终必须<= KMEMSIZE .

.NET 程序内存占用问题

匿名 (未验证) 提交于 2019-12-02 23:49:02
原文链接: http://www.cnblogs.com/fromchaos/archive/2012/08/27/2658033.html 1、使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多 2、强制垃圾回收 3、多dispose,close 4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。 5、发布的时候选择Release 6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append 8、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。 9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科 定期清理执行垃圾回收代码: //在程序中用一个计时器,每隔几秒钟调用一次该函数,打开任务管理器,你会有惊奇的发现 #region 内存回收 [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")] public static extern int SetProcessWorkingSetSize(IntPtr

关于stm32 MCU申请动态内存malloc的认识

匿名 (未验证) 提交于 2019-12-02 23:43:01
首先,malloc( )属于标准C语言函数,当然可以在单片机上使用,如STM32可以先在启动文件中设置heap的大小,再使用动态内存分配: 但是一般单片机的内存都比较小,而且没有MMU,malloc 与free的使用容易造成内存碎片。而且可能因为空间不足而分配失败,从而导致系统崩溃,因此应该慎用,或者自己实现内存管理。 以下摘自网络: 在函数中使用malloc,如果是大的内存分配, 而且malloc与free的次数也不是特别频繁,使用malloc与free是比较合适的, 但是如果内存分配比较小,而且次数特别频繁,那么使用malloc与free就有些不太合适了。 因为过多的malloc与free容易造成内存碎片,致使可使用的堆内存变小。 尤其是在对单片机等没有MMU(内存管理)的芯片编程时,慎用malloc与free。 如果需要对内存的频繁操作,可以自己实现一个内存管理。如外扩芯片用来实现内存管理,进行大容量的存储内存等方式。 使用动态内存分配,应分不同的应用场合。 对于在操作系统上运行的程序,实际的物理内存分配与释放使用操作系统来实现的,即使程序调用了 malloc和free物理内存并不会马上变化。物理内存的变化,直到系统的内存管理操作时才发生。 对于裸机跑在MCU上的程序,分配与释放内存都会造成实际物理内存的变化。因为此时物理内存的分配是由自己实现的,而内存管理我们自己并没有去做

top输出含义

匿名 (未验证) 提交于 2019-12-02 23:35:02
这个命令的使用比较简单,选项解释如下: -h,表示help的意思,查看top命令的使用语法。 -v,表示version的意思,和-h的运行结果是一样,可以查看top命令的版本。 -d,如果仅仅执行top命令,一般默认是3秒钟数据更新一次,这个可以更改多长时间更新一次,单位是秒。 -n,表示数据更新多少次后就结束命令的执行。默认是不结束。 -u,显示指定用户的进程。 -p,显示指定的进程信息。 一,前面两行信息 16:03:58 表示系统当前时间。 up 23:55,表示系统已经运行时间。 17 users,当前登录的用户数。 load average: 3.39 , 3.88 , 3.62。这分别表示内核任务队列在1分钟、5分钟、15分钟的长度。就是通常我们说的负载。 Tasks:288 total。当前系统的进程总数。 4 running,当前系统中有4个正在运行的进程。 284 sleeping ,当前系统中有284个休眠的进程。 0 stopped 。停止进程数为0。 0 zombie。僵死进程数为0。 二,CPU信息 %us。用户空间进程占用CPU时间的百分比。 %sy。内核空间进程占用CPU时间的百分比。 %ni。ni表示nice的意思,也就是哪些用户进程被提升优先级之后,占用的CPU运行时间。 %id。系统空闲时间。 %wa。这个表示CPU在等待磁盘写入的时间。 %si