内存碎片

Java代码常见优化方案

烈酒焚心 提交于 2020-02-26 01:56:17
Java代码常见优化方案 首先,良好的编码规范非常重要。在 java 程序中,访问速度、资源紧张等问题的大部分原因,都是代码不规范造成的。 单例的使用场景 单例模式对于减少资源占用、提高访问速度等方面有很多好处,但并不是所有场景都适用于单例。 简单来说,单例主要适用于以下三个方面: 多线程场景,通过线程同步来控制资源的并发访问。 多线程场景,控制数据共享,让多个不相关的进程或线程之间实现通信(通过访问同一资源来控制)。 控制实例的产生,单例只实例化一次,以达到节约资源的目的; 不可随意使用静态变量 当某个对象被定义为 static 变量,那么 GC 通常是不会回收这个对象所占有的内存。 示例如下: public class A { private static B b = new B(); } 此时静态变量 b 的生命周期与 A 类同步,即如果 A 类不卸载,b 对象会常驻内存,直到程序终止。 创建 Java 对象使用注意事项 根据业务使用场景,尽量避免在循环中 new 对象。 这是因为系统要花费时间来创建对象,而且还要花时间对这些对象进行管理和垃圾回收。所以在可以控制的范围内,尽量保证最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。 final 修饰符使用注意事项 final 修饰符的类是不可派生的,即不可被继承。在 java 核心代码中,有很多 被 final

Linux内存使用调整

☆樱花仙子☆ 提交于 2020-02-26 01:28:24
前段时间在做播放器的时候,遇到个问题,花了很长时间,做个记录,希望对有需要的人有所帮助: 播放器的播视频的时候,无论是手动切换视频还是到视频播放完成,自动切换视频,一定次数后均出现黑屏现象,偶尔有声音,问题出现后,不可恢复,Kernel输出如下Log: DMA free:71672kB min:616kB low:768kB high:924kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolateds lowmem_reserve[]: 0 1244 1593 1593 Normal free:1249804kB min:4212kB low:5264kB high:6316kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB o lowmem_reserve[]: 0 0 2794 2794 HighMem free:223000kB min:348kB low:640kB high:936kB active_anon:39248kB inactive_anon:140kB active_file:61020kB inactive

【译】让垃圾回收器高效工作(四)

六月ゝ 毕业季﹏ 提交于 2020-02-26 01:27:51
这篇文章我们来谈谈垃圾回收器和程序的虚拟内存、物理内存之间的关系。再谈谈怎样判断你的托管堆是否是健康的;为什么在机器还有大量内存的情况下程序会抛出OutofMemoryException。 垃圾回收和物理内存虚拟内存之间的关系: 如果你对这个话题已经了如指掌,请跳过这一段。 GC需要分配段,有关段的解释请参考《 让垃圾回收器高效工作(一) 》。GC调用VirtualAlloc来分配段空间。这意味着如果你的进程中没有足够的连续空间,分配就失败了。这是一种GC抛出OutOfMemeoryException的合法的情况(精确的说,GC没有抛出异常,抛出异常是执行引擎干的,GC只是在分配失败时返回了NULL)。 经常有人问我这样的问题:“为什么我程序的托管堆只使用了X MB的内存,运行时抛出了OutofMemoryException呢?” 其中XMB比2GB小得多。 记住在.Net程序中有一些内存不是GC消耗的。GC和其他一些东西一样是在竞争虚拟内存的空间。比如:你进程中载入的模块需要占用虚拟内存;有些模块直接调用本机代码分配内存也会消耗虚拟内存(VirtualAlloc,HeapAlloc,C++的new等等)。CLR本身也会有些不通过GC分配消耗的内存,比如jitted代码,一些CLR需要的数据结构等等。通常CLR需要的内存是相当小的。你可以通过SOS的

虚拟内存(摘自百度百科)

喜你入骨 提交于 2020-02-25 07:06:11
虚拟内存是计算机系统 内存管理 的一种技术。它使得 应用程序 认为它拥有连续的可用的 内存 (一个连续完整的 地址空间 ), 而实际上,它通常是被分隔成多个 物理内存 碎片,还有部分暂时存储在外部 磁盘存储器 上,在需要时进行 数据交换 。 简介 别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由 内存 执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题, Windows 中运用了虚拟内存 [1] 技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的 随机存储器 ( RAM )不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和 硬盘 上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“ 分页 文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。    虚拟内存不足的成因   【1】、 感染病毒 :有些病毒发作时会占用大量内存空间,导致系统出现 内存不足 问题。   【2】

理解Android虚拟机体系结构

社会主义新天地 提交于 2020-02-24 17:32:10
1 什么是Dalvik虚拟机   Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层。 2 Dalvik虚拟机的功能   Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。Dalvik充分利用Linux进程管理的特定,对其进行了面向对象的设计,使得可以同时运行多个进程,而传统的Java程序通常只能运行一个进程,这也是为什么Android不采用JVM的原因。Dalvik为了达到优化的目的,底层的操作大多和系统内核相关,或者直接调用内核接口。另外,Dalvik早期并没有JIT编译器,直到Android2.2才加入了对JIT的技术支持。 3 Dalvik虚拟机和Java虚拟机的区别   本质上,Dalvik也是一个Java虚拟机。但它特别之处在于没有使用JVM规范。大多数Java虚拟机都是基于栈的结构(详情请参考:

Java之GC 如何工作

僤鯓⒐⒋嵵緔 提交于 2020-02-24 15:24:00
一、什么是GC? GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。 二、GC如何工作? 引用计数 每个对象都含有一个计数器,当引用连接至对象时+1,引用离开作用域或被置为null时-1。GC遍历全部对象,发现计数器为0的时候就会释放其内存。 优点:简单 缺点:慢、循环引用问题、对象应该被回收但引用计数不为零 引用计数只是为了说明GC的工作方式,但实际上似乎没有任何Java虚拟机实现过。 根搜索算法 原理:每个“活”的对象,一定能追溯到其存活在堆栈或静态存储区之中的引用。 方法:从堆栈和静态存储区开始,遍历所有引用;然后追踪它所引用的对象,然后是这些对象包含的所有对象,反复进行直至“根源于堆栈和静态存储区的引用”所形成的网络被全部访问完为止 停止-复制算法 先暂停程序的运行,然后将全部活的对象从当前堆复制到另一个堆,没有复制的都是垃圾;新堆里的对象在内存中时连续的 不属于后台回收模式,因为要暂停程序的运行 把对象从一个堆复制到另一个堆时,所有指向它们的引用都必须要修正。 效率低的原因(1):需要两个分离的堆

Java代码常见优化方案

吃可爱长大的小学妹 提交于 2020-02-23 03:42:30
Java代码常见优化方案 首先,良好的编码规范非常重要。在 java 程序中,访问速度、资源紧张等问题的大部分原因,都是代码不规范造成的。 单例的使用场景 单例模式对于减少资源占用、提高访问速度等方面有很多好处,但并不是所有场景都适用于单例。 简单来说,单例主要适用于以下三个方面: 多线程场景,通过线程同步来控制资源的并发访问。 多线程场景,控制数据共享,让多个不相关的进程或线程之间实现通信(通过访问同一资源来控制)。 控制实例的产生,单例只实例化一次,以达到节约资源的目的; 不可随意使用静态变量 当某个对象被定义为 static 变量,那么 GC 通常是不会回收这个对象所占有的内存。 示例如下: public class A { private static B b = new B(); } 此时静态变量 b 的生命周期与 A 类同步,即如果 A 类不卸载,b 对象会常驻内存,直到程序终止。 创建 Java 对象使用注意事项 根据业务使用场景,尽量避免在循环中 new 对象。 这是因为系统要花费时间来创建对象,而且还要花时间对这些对象进行管理和垃圾回收。所以在可以控制的范围内,尽量保证最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。 final 修饰符使用注意事项 final 修饰符的类是不可派生的,即不可被继承。在 java 核心代码中,有很多 被 final

Flink的入门

◇◆丶佛笑我妖孽 提交于 2020-02-22 14:34:13
Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注。本文将深入分析Flink的一些关键技术与特性,希望能够帮助读者对Flink有更加深入的了解,对其他大数据系统开发者也能有所裨益。本文假设读者已对MapReduce、Spark及Storm等大数据处理框架有所了解,同时熟悉流处理与批处理的基本概念。 Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务: DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。 DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。 Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。 此外,Flink还针对特定的应用领域提供了领域库,例如: Flink ML,Flink的机器学习库

Linux线程栈内存总结

落爺英雄遲暮 提交于 2020-02-20 17:57:42
何为线程栈空间泄露? 何为anon内存? 虚拟内存、物理内存、anon内存的联系 anon与线程的联系 glibc源码库线程创建与销毁anon关系 使用pmap分析虚拟地址空间以及anon内存 何为线程栈空间泄露? 【栈空间泄露】:简单了说就是,创建了线程,系统分配了内存,但是由于异常操作,没有把之前申请的内存还给操作系统,缓存在进程中,导致这块的内存被占用,系统无法分配内存给其他进程。 从用户角度,线程创建后,未设置线程为detach属性,pthread_detach()、pthread_join()销毁函数。 从内存映射角度,在进程中缓存一些无法利用的anon内存。 从系统栈空间分配角度,这些运行结束但是未销毁的线程,既不放在stack_used队列里,也不放在stack_cache,从而线程栈空间不会被调度到。 何为anon内存? 仅个人观点,在操作系统上运行进程,其实是经过两次映射。一次是用户程序到系统配置器分配的虚拟内存申请,一次是虚拟地址空间到物理空间地址的映射,如果是第二次映射建立前,在申请物理空间,未填充物理页内容,建立映射后,仅仅代表已经分配了内存anon,ps:物理空间最小管理单元是“页”。 虚拟内存 操作系统给用户程序的假象地址,与物理内存建立映射关系。 物理内存 类似物理存储器DRAM anon内存 1.调用malloc、brk

.Net Discovery系列之三 深入理解.Net垃圾收集机制(上)

你离开我真会死。 提交于 2020-02-17 23:34:07
前言: 组成.Net平台一个很重要的部分----垃圾收集器(Garbage Collection),今天我们就来讲讲它。想想看没有GC,.Net还能称之为一个平台吗?各种语言虽然都被编译成MSIL,但是运行时的资源回收工作却“各自为战”,这样不但增加了编程难度,也会使内存管理工作变得复杂无比(不同语言处理内存的微小差异,将在回收资源时被放大),更也不利于平台移植。 这篇文章将全面的为大家介绍.Net 垃圾收集的运行方式、算法,以及与垃圾收集相关的关键方法。 说到垃圾收集机制,很少有人知道,垃圾收集并不是伴随Java出现的,早在1958年,图林奖得主John发明的Lisp语言就已经提供了GC的功能,这是GC的第一次出现,是思想的一次闪光!而后,1984年Dave Ungar发明的Small talk语言第一次正式采用了GC机制。 .Net的垃圾回收机制是个很大的话题,如果你没接触过类似C++那样的语言,就很难理解GC是一个多么重要、令人兴奋的东西: 1.提高软件系统的内聚。 2.降低编程复杂度,使程序员不必分散精力去处理析构。 3.不妨碍设计师进行系统抽象。 4.减少由于内存运用不当产生的Bug。 5.成功的将内存管理工作从程序的编写时,脱离至运行时,使不可预估的管理漏洞变为可预估的。 正文: 本文将通过“GC的算法与工作方式”、“GC关键方法解析”两节来讲述.Net垃圾收集机制。