内存溢出

JVM性能优化

给你一囗甜甜゛ 提交于 2020-03-03 16:46:59
内存溢出 内存溢出的原因:程序在申请内存时,没有足够的内存空间。 内存溢出的几种方式 : 1,栈溢出:方法死循环递归(StackOverflowError),不断创立线程(OutOfMemoryError) 2,堆溢出:不断创建对象,分配对象大于最大堆的大小(OutOfMemoryError) 3,直接内存:分配的本地内存大小大于JVM的限制。 4,方法区溢出:在经常动态生产大量Class的应用中,CGLib字节码增强,动态语言,大量JSP文件,大量基于OSGi的应用 内存泄漏 程序在申请内存后,无法释放已申请的内存空间。 内存泄漏的集中原因 : 1,长生命周期的对象持有短生命周期对象的引用:例如将ArrayList设置为静态常量,则容器中的对象在程序结束之前是不能被释放的,从而造成内存泄漏。 2,链接未关闭:如数据库连接池、网络链接和IO链接等,只有链接被关闭后,才会回收对应的对象 3,变量作用域不合理:例如 1.一个变量的定义的作用范围大于其使用范围。2.没有及时把对象设置为null 4,内部类持有外部类:内部类的生命周期长于外部类,程序很容易产生内存泄漏。解决办法,使用软引用或弱引用,通过构造方法传递 5,Hash值得变化:在集合中,如果修改参与计算哈希值字段,会导致无法从集合中单独删除当前对象,造成内存泄漏 内存溢出和内存泄漏的区别 内存溢出:实实在在的内存空间不足导致

Java面试全解析(22)ThreadLocal 有什么用

浪尽此生 提交于 2020-03-03 15:24:09
什么是 ThreadLocal? ThreadLocal 诞生于 JDK 1.2,用于解决多线程间的数据隔离问题。也就是说 ThreadLocal 会为每一个线程创建一个单独的变量副本。 ThreadLocal 有什么用? ThreadLocal 最典型的使用场景有两个: ThreadLocal 可以用来管理 Session,因为每个人的信息都是不一样的,所以就很适合用 ThreadLocal 来管理; 数据库连接,为每一个线程分配一个独立的资源,也适合用 ThreadLocal 来实现。 其中,ThreadLocal 也被用在很多大型开源框架中,比如 Spring 的事务管理器,还有 Hibernate 的 Session 管理等,既然 ThreadLocal 用途如此广泛,那接下来就让我们共同看看 ThreadLocal 要怎么用?ThreadLocal 使用中要注意什么?以及 ThreadLocal 的存储原理等,一起来看吧。 ThreadLocal 基础使用 ThreadLocal 常用方法有 set(T)、get()、remove() 等,具体使用请参考以下代码。 ThreadLocal threadLocal = new ThreadLocal(); // 存值 threadLocal.set(Arrays.asList( "老王" , "Java 面试题" )); /

jvm内存溢出性能调优

 ̄綄美尐妖づ 提交于 2020-02-29 01:05:14
常用工具及命令 jps jstat Top jstack jmap mat工具 top -Hp pid可以查看某个进程的线程信息 -H 显示线程信息,-p指定pid jps:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称及进程pid 如:jps -l pid Jstack命令 jstack是java虚拟机自带的一种堆栈跟踪工具。用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程的几种状态: NEW:未启动的。不会出现在Dump中。 RUNNABLE:在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。 BLOCKED:受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。 WATING:无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。 TIMED_WATING:有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。 TERMINATED:已退出的。 例一: public

b+树的原理

橙三吉。 提交于 2020-02-28 10:27:38
Java 内存区域 <ignore_js_op> Heap 线程公有 存放实例对象 是GC主要管理区域,因此可以更细致的划分为:新生代、老年代 再细致一点划分:Eden区、From Survivor区、To Survivor区 内存空间:可以物理上不连续、逻辑上连续即可。 Method Area 线程公有 主要存储:类信息、常量、静态变量、编译后的代码 运行时常量池 主要存储:编译期的字面量以及符号引用 具有动态性,即可以在运行时将常量放入池中。 VM Stack 线程私有 主要包括: 局部变量表:存放编译期的各种基本数据类型、对象引用、returnAddress类型 操作数栈:每一个元素可以为任意的java类型,32位数据类型所占容量为1,64位数据类型所占容量为2 动态连接:class文件的常量池中有大量的符号引用,这些符号引用有一部分是在类加载阶段或者在第一次使用的时候就转换为直接引用,这部分成为静态解析。另一部分是每一次运行的时候转化为直接引用,这部分即为动态连接。 方法出口:例如A方法中调用了B方法,B方法的返回值压入A方法的栈帧中。 Native Method Stack 线程私有 与VM Stack相似,唯一区别在于该栈为Native方法服务。 Hot Spot 将VM Stack 与 Native Method Stack 合而为一。 Program Counter

查询内存溢出

人走茶凉 提交于 2020-02-26 21:33:30
首先我们来看一个带排序的查询,点击工具栏的 显示包含实际的执行计划。 1 SELECT * FROM AdventureWorks2008R2.Person.Person WHERE FirstName LIKE 'w%' ORDER BY 1 从执行计划里可以看出,SELECT运算符包含了 内存授予(Memory Grant) 信息(一般情况下不会出现,这里是因为我们的语句包含排序操作)。内存授予是KB为单位,是当执行计划中的一些运算符(像Sort/Hash等运算符)的执行,需要使用内存来完成——因此也被称为 查询内存(Query Memory) 。 在查询正式执行前,查询内存必须被SQL Server授予才可以。对于提供的查询,查询优化器根据查询对象的对应统计信息来决定需要多少查询内存。现在的问题就是,当统计信息过期了,SQL Server就会低估要处理的行数。在这个情况下,SQL Server对于提供的查询还是会请求更少的查询内存。但当查询真正开始后,SQL Server就不能改变授予的内存大小,也不能请求更多的内存。查询必须在授予的查询内存里完成操作。在这个情况下,SQL Server需要把Sort/Hash运算符涌进TempDb,这就意味我们原先在内存里快速操作变成物理磁盘上慢速操作。SQL Server Profiler可以通过 Sort Warnings 和 Hash

内存溢出和内存泄漏的区别、产生原因以及解决方案

旧时模样 提交于 2020-02-16 08:45:03
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。 一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出. 以发生的方式来分类, 内存泄漏可以分为4类: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境

如何避免内存泄漏、溢出

雨燕双飞 提交于 2020-02-16 08:44:39
什么是内存泄漏、溢出: 1、内存泄漏 memory leak:对象可达但不可用;是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 2、内存溢出 out of memory:内存大小不够;是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 如何避免内存泄漏、溢出 1、尽早释放无用对象的引用 好的办法是使用临时变量的时候,让引用变量在推出活动域后自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄漏。 2、程序进行字符串处理时,尽量避免使用String,而应该使用StringBuffer。 因为String类是不可变的,每一个String对象都会独立占用内存一块区域。 3、尽量少用静态变量 因为静态变量是全局的,存在方法区,GC不会回收。(用永久代实现的方法区,垃圾回收行为在这个区域是比较少出现的,垃圾回收器的主要目标是针对常量池和类型的卸载) 4、避免集中创建对象,尤其是大对象,如果可以的话尽量使用流操作 JVM会突然需要大量内存,这时会出发GC优化系统内存环境 5、尽量运用对象池技术以提高系统性能 生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏

探索OutOfMemoryError与StackOverflowError

烂漫一生 提交于 2020-02-14 06:03:06
本文的目的有两个:1.OutOfMemoryError与StackOverflowError异常在哪个区域发生,2.解决问题的思路;因工作中发现团队的好多人知道一堆定位工具,但对于定位思路模糊不清,不知道所报异常具体问题在哪里胡乱分析,效率低下,故而总结下文。 一、OutOfMemoryError异常 1.1 Java堆(-Xmx -Xms) 1.1.1标识: java.lang.OutOfMemoryError:heap space(比较常见) 1.1.2产生的原因:1.内存泄漏(Memory Leak) 2.内存溢出(Memory OverFlow) 1.1.3定位手段:可以通过参数-XX:+HeapDumpOnOutOfMemoryError让虚拟机在出现内存异常的时候Dump出当前内存堆转存快照以便进行事后分析。 内存泄漏:查看泄漏对象到GC Roots的引用链,找到泄漏对象是通过什么引用路径、与那些GC Roots想关联,才导致垃圾回收器无法回收他们。 内存溢出:对象是必须存在的,得检查Java虚拟机的堆参数(-Xmx -Xms)设置,与机器的内存对比,看看是否还有向上调整的空间。再从代码上检查是否存在某些生命周期过长的对象,持有状态时间过长,存储设计不合理等情况,尽量减小程序运行的情况。 1.2虚拟机栈与本地方法栈 当虚拟机栈允许动态扩展

内存管理:如何避免内存溢出和频繁的垃圾回收?

老子叫甜甜 提交于 2020-02-14 01:41:54
自动内存管理机制的实现原理 做内存管理,主要需要考虑 申请内存和内存回收 这两个部分。 申请内存的逻辑非常简单: 1、计算要创建对象所需要占用的内存大小; 2、在内存中找一块儿连续并且是空闲的内存空间,标记为已占用; 3、把申请的内存地址绑定到对象的引用上,这时候对象就可以使用了。 内存回收 内存回收需要做这样两件事儿: 1、先是要找出所有可以回收的对象,将对应的内存标记为空闲 2、整理内存碎片。 采用GC算法找出可回收对象,此类算法大多采用 “标记-清除“ 算法或其变种,此类算法分为标记和清除两阶段: 标记阶段:从 GC Root 开始,你可以简单地把GC Root 理解为程序入口的那个对象,记所有可达的对象,因为程序中所有在用的对象一定都会被这个 GC Root 对象直接或者间接引用。 清除阶段:遍历所有对象,找出所有没有标记的对象。这些没有标记的对象都是可以被回收的,清除这些对象,释放对应的内存即可。 缺点: 效率不高、空间问题、在执行标记和清除过程中,必须把进程暂停(Stop the world)。 java虚拟机中常见的垃圾收集器及其对应垃圾收集算法: 垃圾收集器 1、 Serial收集器。 (虚拟机运行在Client模式下的默认新生代收集器) 单线程收集器,在进行垃圾收集时,必须暂停所有其他的工作线程,直至结束。 2、 ParNew收集器 Serial收集器的多线程版本

JVM探秘:内存溢出

人盡茶涼 提交于 2020-02-13 10:30:25
在 Java 虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生OutOfMemoryError,这次通过一些代码来验证虚拟机各个内存区域存储的内容。 在实际工作中遇到内存溢出异常时,需要做到能根据异常信息快速判断是哪个内存区域的溢出,知道什么样的代码会导致这些区域内存溢出,并且知道出现内存溢出后如何处理。 Java堆溢出# Java 堆用于存储对象实例,只要不断的扩展对象,并且保证 GC Roots 到对象有可达路径来避免垃圾回收,那么对象数量到达堆的最大容量后就会发生内存溢出异常。 模拟堆内存溢出# 以下代码会把堆大小限制在20M且不可扩展(将最小参数-Xms和最大参数-Xmx设为相同就会避免自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在发生内存溢出时Dump出内存快照用来分析。 参数 说明 -XX:+HeapDumpOnOutOfMemoryError 内存溢出时自动导出内存快照 -XX:HeapDumpPath=E:/dumps/ 导出内存快照时保存的路径 Copy /** * Java堆内存溢出异常 * VM args: -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError * -Xms和-Xmx设为相同值避免堆内存自动扩展, * -XX: