内存碎片

Java高频面试题

谁说胖子不能爱 提交于 2020-02-27 10:20:35
前言 疫情确诊的人数每天都在增加,离去的人也在增多,这个世界上有很多事我们无能为力也无从选择,日升日落,白昼黑夜,我们能看见白昼中的光芒,我们也能看见黑暗里的流氓。暮色四合,龌龊八开。鲜花还是塑料花,香或臭,当潮水散去,现在即历史,而历史通常是由后人说的。 所以还是上次跟乡亲们说的,我们不要传播未经证实或者不该传播的消息,舆论的力量是我们无法估计的,有些也是我们无法承担的,所以乡亲们也要重视起来,点到即止。无法控制别人,但可以做好自己,帮不了别人,但可以不祸害别人。 我不是个喜欢蹭热度的人,上面那段话乡亲们看看就好,现阶段最重要的就是老老实实待在家里,不聚集,也尽量不出门,自己和家人都要做好安全防护,老百姓经历了太多风风雨雨,相信这次一定也会安然无恙的渡过此劫。那待在家里的这段时间,如果能远程办公的,就做好公司交代的事,无法办公的乡亲们也不要停止学习,因为疫情过去之后,一定会有巨大的变动或者机会来临,而到那时,你准备好了吗? 这几天一直在想,码之初能做点什么?最终决定在这个期间就推出一个面试系列,都是经过我精心整理的,希望能给乡亲们一点帮助。下面进入正题。 高频面试题 1、说说对象的四中引用? 1) 强引用 只要引用存在,垃圾回收器永远不会回收。 Object obj = new Object(); User user=new User(); 可直接通过obj取得对应的对象 如

【ActiveMQ Tuning】System Environment

China☆狼群 提交于 2020-02-27 08:52:42
http://fusesource.com/docs/broker/5.4/tuning/GenTuning-SysEnv.html Overview :在研究ActiveMQ Broker优化之前,值的重点关注一下系统环境对于性能的影响。 Disk speed (磁盘速度):持久化的Broker,磁盘速度是一个重大的影响因素。举例来说:典型的桌面磁盘的寻道时间为9ms,而高性能的服务器磁盘寻道时间则为3ms。同样你需要确保磁盘没有过多的碎片。 Network performance (网络性能):不管是Broker是否持久化,网络速度都是一个限制因素。如果网络很慢的话,它会制约通过Broker的通道。一种策略是你可以压缩大消息。 (see Enabling compression ),它可以降低网络延迟的风险。因此,启动更多异步行为可能也是个好主意。 Hardware specification (硬件规格):重要的硬件基础包括CPU的速度和个数,broker的可用内存。特别的,提高可用内存可以提高多个服务的性能。 举例来说,如果broker的B-tree index可以全部加载到内存中的话,可以显著的减少对于磁盘读写的需求度。另外,如果消费者较慢,broker需要大量的内存用于接收消息。 Memory available to the JVM (JVM可用内存):使用 -Xmx

[Reading] Asking while Reading

偶尔善良 提交于 2020-02-27 02:16:20
           Asking while Reading           ——读Java垃圾收集器与内存分配策略 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。 为什么要了解垃圾回收?   当需要排查各种内存溢出、内存泄漏问题的时候,当垃圾回收成为了系统达到更高并行量的瓶颈的时候,我们就需要根据情况(往往是根据硬件和程序 以及它们在各种垃圾回收算法下运行的情况)选择恰当的垃圾回收方式,作出必要的监控和调节。 哪些内存需要回收? 换一句话来说:哪些内存可以回收,哪些内存又值得回收;可以回收明确我们的执行范围,而回收价值明确我们的主要目标,当然这不是一定的, 对每个项目都可能有不同的着眼点,这也是我们要理解垃圾回收方法与过程的原因。 Java堆和方法区与栈不同,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运 行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾回收器关注的是这部分内存。    方法区也需要回收吗? 方法区可以不回收,因为Java虚拟机规范中说过不要求虚拟机在方法区中实现垃圾收集,更重要的原因是其性价比一般较低,原因如下: 我们知道对方法区的收集集中在对常量、无用的类的收集。   1) 效率:常规一次垃圾收集可以回收70

bullet中的内存池

空扰寡人 提交于 2020-02-26 22:08:56
1。概念(见于Baidu)  内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。  内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。 2.Bullet内存池(btPoolAllocator.h ) 内存池可以是反复的new delete更有效率,而且很有效的避免了内存碎片。btPoocclAllocator提供了一个简单的内存池,包括初始化分配足够数量的内存,申请内存等常用的方法。这个内存池比较好用于反复分配释放同一个对象,初始化了N*size(object)大小的内存,每次分配大小是一个Object。 1 class btPoocclAllocator 2 { 3 int m_elemSize; //每个对象的大小 4 int m_maxElements;//最大容量 5 int m_freeCount;//剩余的个数 6 void* m_firstFree;//每次分配的起点 7 unsigned char* m_pool; /

内存池技术详解

半世苍凉 提交于 2020-02-26 21:37:03
我们都知道频繁的动态内存分配很可能会造成大量的内存碎片和效率低下,因为需要搜索整个空闲链表找到可以被分配的内存块,而且容易造成内存泄漏等问题,那么如何解决这两个问题呢? 内存池技术带你走进这个问题的殿堂。 内存池技术首先会分配一大块内存给程序,当程序需要分配内存的时候从内存池中去获得,而且不需要去释放内存,当内存池不在用的时候释放整个内存即可,只分配,不释放,大大减少了时间。 优势: 1·效率快,无需调用malloc或者new,系统调用慢,而且搜索空闲块也慢 2·不会产生过多的内存碎片, 3·可以避免内存泄漏 nginx=NX nginx的内存池设计非常巧妙得利用了HTTP短连接的特性,为每一个HTTP请求分配一个内存块,当HTTP连接保持时,这个内存块只分配不释放,当 HTTP断开时,释放整块大内存,由于HTTP基本上连接时间都是非常短的,所以不可能会出现内存池把整个内存沾满的情况 memcached的内存池主要是针对键值对的特性进行优化的,但实现方式和nginx完全不同,这个我没有仔细研究,具体特性不详 STL的二级分配器也是一种属于只分配不释放的内存池,但是它只针对于小雨128bytes的小块内存申请和释放,大于128bytes的内存申请还是直 接调用malloc的。在使用STL过程中,默认是关闭二级分配器,如果真要使用,要通过宏来进行打开该功能。但是用这个分配器要小心

如何优雅的学习JVM,升华篇(三)

为君一笑 提交于 2020-02-26 15:51:16
此次内容和大家分享JVM中关于垃圾回收(Garbage Collect)的相关知识。 一、如何确定一个对象是垃圾? 要想进行垃圾回收,得先知道什么样的对象是垃圾。 1.1 引用计数法 对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾。 注意: 如果A、B两个对象互相持有引用,会导致永远不能被回收。 1.2 可达性分析 通过GC Root的对象,可以开始向下寻找,看某个对象是否可达。 可以作为GC Root:类加载器、Thread、虚拟机栈的本地变量表、静态成员、常量引用、本地方法栈的变量等。 二、垃圾回收算法 2.1 标记-清除(Mark-Sweep) 标记(Mark) 找出内存中需要回收的对象,并把它们标记出来。此时堆中所有的对象都会被扫描一遍,从而才能确定需要回收的对象,比较耗时。 清除(Sweep) 清除掉被标记需要回收的对象,释放出对应的内存空间。 不足 1、标记和清除两个过程都比较耗时,效率不高 2、会产生大量的不连续的内存碎片,空间碎片太多可能会导致在以后程序运行的过程中需要分配较大的对象时,无法找到足够的连续内存而不得不提前触发一次垃圾回收动作。 2.2 复制(Copying) 将内存划分为两块相等的区域,每次只使用其中一块,如下图 当其中一块内存使用完了,就将还存活的对象复制到另一块上面

OOM以及垃圾收集器

点点圈 提交于 2020-02-26 10:06:15
1.常见的几种OOM? ①java.lang.StackOverflowError②java.lang.OutOfMemoryError:Java heap space③java.lang.OutOfMemoryError:GC overhead limit exceeded④java.lang.OutOfMemoryError:Direct buffer memory⑤java.lang.OutOfMemoryError:unable to create new native thread⑥java.lang.OutOfMemoryError:Metaspace /** * 描述:GC overhead Limit * jvm参数配置演示:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+MaxDirectMemorySize=5m * GC回收时间过长会抛出OutOfMemroyError,过长的定义是,超过98%的时间来做GC并且只回收了不到2%的堆内存 * 连续多次GC都只是回收了不到2%的极端情况下才会抛出,假如不抛出GC Overhead limit错误会发生什么呢? * CPU使用率一直是100%,而GC没有任何成功 * * @author xinjiao.yu@marketin.cn * @create 2020/2/24 21:41

Java代码常见优化方案

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

Golang之变量去哪儿

蹲街弑〆低调 提交于 2020-02-26 07:30:36
目录 什么是逃逸分析 为什么要逃逸分析 逃逸分析是怎么完成的 逃逸分析实例 总结 参考资料 写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露,搞得胆战心惊。 切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。堆和栈的区别对程序员“模糊化”了,当然这一切都是Go编译器在背后帮我们完成的。 一个变量是在堆上分配,还是在栈上分配,是经过编译器的 逃逸分析 之后得出的结论。 这篇文章,就将带领大家一起去探索 逃逸分析 ——变量到底去哪儿,堆还是栈? 什么是逃逸分析 以前写C/C++代码时,为了提高效率,常常将 pass-by-value (传值)“升级”成 pass-by-reference ,企图避免构造函数的运行,并且直接返回一个指针。 你一定还记得,这里隐藏了一个很大的坑:在函数内部定义了一个局部变量,然后返回这个局部变量的地址(指针)。这些局部变量是在栈上分配的(静态内存分配),一旦函数执行完毕,变量占据的内存会被销毁,任何对这个返回值作的动作(如解引用),都将扰乱程序的运行,甚至导致程序直接崩溃。比如下面的这段代码: int *foo ( void ) { int t = 3; return &t; }

程序员悲催瞬间:来之不易的美团面试,竟然挂了(还原真实场景)

老子叫甜甜 提交于 2020-02-26 02:36:39
一面 1、自我介绍 答:自我介绍是面试中唯一的自己主动介绍自己的环节,一定要好好把握好,你数据结构学的号可以手撕一个红黑树你就说我数据结构掌握地很好,反正就是要把自己的优势凸显出来,比如自己对于java的知识较熟悉,我介绍完自己的本科经历以后,我就说我是保送到本校继续读研究生,然后最末尾会加上自己熟悉java,然后面试官就会问java的一些东西; 2、项目介绍及其亮点 答:使劲吹... 3、java的8种数据类型有哪些? 答:感觉这个问题被问烂了,int,short,long,float,double,byte,boolean,char; 4、问了Integer缓存数据的范围? 答:-128-127 5、紧接着问了Object类有哪些方法? 答:这个我有背过,clone,getClass,toString,finalize,equals,hashCode,wait,notify,notifyALL。(不懂面试这个什么意思) 6、问到这里然后拿出了一个题,面试官有小纸条,题目在上面,String A = "123"; String B = new String("123");,问我生成了几个String对象? 答:我说如果常量池中,原来没有“123”那么就是生成了2个对象,如果常量池中有“123”那么只要1个对象生成(面试官别问这种问题了) 7、由于提到了wait