内存溢出

Java 内存结构之虚拟机栈

一曲冷凌霜 提交于 2019-12-01 09:02:11
2.虚拟机栈 定义:虚拟机栈(Java Virtual Machine Stacks)就是每个线程运行需要的内存空间,栈由一个一个的栈帧(Frame)组成,栈帧就是每个方法运行时需要的内存(方法的参数、局部变量、返回地址) 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法 问题分析 垃圾回收是否涉及栈内存?不涉及 栈内存分配越大越好吗?不是,设置大一点只不过是增加了递归调用的效率 方法内的局部变量是否线程安全? 如果方法内局部变量没有逃离方法的作用范围,它就是线程安全的 如果局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全问题 栈内存溢出 栈帧过多会导致栈内存溢出(方法递归调用就会导致栈内存溢出) 栈帧过大也会导致栈内存溢出(这种情况不太容易出现) 两个类之间互相引用,在JSON格式转换的时候会出现递归调用,导致栈内存溢出 来源: https://www.cnblogs.com/zxfei/p/11674793.html

Java内存区域与内存溢出异常

旧巷老猫 提交于 2019-12-01 08:21:05
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示期。字节码解释器工作时就是通过这个计算器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法,这个计数器值则为空(Undefined)。 Java虚拟机栈 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacke)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个帧栈

Java内存区域和内存溢出异常

时光毁灭记忆、已成空白 提交于 2019-12-01 07:24:15
  Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来——《围Java》·周志明   Java程序员将c++中繁琐的delete交给了虚拟机,虽然我们一直创建对象,但从未手动删除过对象,这一切正悄然发生着。我们把内存控制的权利交给了JVM,直到那一天,Java程序员终于想起了曾一度被他们支配的恐怖和被囚禁于鸟笼中的那份屈辱。 一、运行时数据区/内存模型   运行时数据可划分为若干个数据区域,其中有的属于线程共享,而又有些为线程私有。共享区域会随着虚拟机进程的启动而存在,而线程私有的区域会随着线程的启动和结束而建立和销毁。    二、程序计数器(Program Counter Register)   我更喜欢用“寄存器”的概念去理解他,我们知道在CPU中有寄存器用于保存指令地址和保存计算结果。类似的,程序计数器就像一个指针,保存了指向方法区中的方法字节码的地址,程序寄存器只占用很小的内存空间,是线程私有的,可以看做是当前线程所执行的字节码的行号指示器,如果你查看程序字节码,会发现很多指令,程序计数器按顺序存储这些字节码,执行引擎执行计数器中的字节码以实现循环、跳转、分支、线程恢复等操作。由于程序计数器是线程私有的,没一条线程都会有一个独立的程序计数器,所以各个线程之间的程序计数器互不影响,独立存储。如果正在执行的是本地方法

tomcat内存溢出OutOfMemoryError

我的梦境 提交于 2019-12-01 05:12:11
出现OutOfMemoryError PermGen space系统错误,通过在网上查阅资料,发现这个错误并不是Tomcat的问题,而JVM设计自身的一个缺陷,JVM把内存分了不同的区, PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,类加载的时候就存放在这个区域中。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收! 老外一直认为这是sun JVM的一个bug,曾有这样的评价:“A bug this critical is open since 2003? Absolutely shameful”-- 我觉得SUN在这个BUG上确实有些丢脸。没想到至今这个问题还没未能解决,有人给出最好的解决方法是不使用JDK,使用BEA的JRokit,当然现在Oracle,BEA,SU已经成为一家人了,我想这个问题应该会更快有更好的解决方案。 好了还是说说如何解决问题吧,网上大量的资料说在tomcat这样设置:SET JAVA_OPTS= -Xms64m -Xmx512m,但经过本人的测试,没有一点作用,详细看了JVM内存的分配机制后才知道,-Xms和--Xmx是调整Java heap space

linux/centos解决Tomcat内存溢出

狂风中的少年 提交于 2019-12-01 04:50:28
Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个JAVA 虚拟机 。JAVA程序启动时JVM会分配一个初始内存和最大内存给APP。当APP需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。 一、常见的 Java 内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space 即JVM Heap溢出 解释说明:JVM在启动的时候会自动设置JVM Heap的值,JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。其初始空间默认是物理内存的1/64,最大空间不可超过物理内存。JVM提供-Xmn -Xms -Xmx等选项来进行设置。 出错场景:在JVM中,如果98%的时间是用于GC,且可用的Heap size不足2%时,将会出现JVM Heap溢出 解决方法:修改JVM Heap的大小。 2. java.lang.OutOfMemoryError: PermGen space 即PermGen space溢出 解释说明:PermGen space是指内存的永久保存区域。这个区域主要存放Class和Meta信息,Class在被Load时就会被放入PermGen space。 出错场景:如果APP载入很多CLASS,就可能会出现PermGen space溢出。

有关内存溢出和内存泄漏的知识点

拟墨画扇 提交于 2019-12-01 02:26:44
在 jvm 中,有关内存可能会出现的两种错误内存溢出和内存泄漏,怎么理解这两种错误: 1 、内存泄漏 memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 2 、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。 3 、二者的关系 内存泄漏的堆积最终会导致内存溢出 内存溢出就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。 内存溢出:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出。比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢

内存溢出和内存泄漏

你。 提交于 2019-11-30 22:16:21
内存溢出(out of memory),是指程序运行要用到的内存,系统没有足够的内存空间供其使用。 内存泄漏(memory leak),是指程序在申请内存使用后,无法释放内存空间,导致系统无法及时回收内存。 java.lang.OutOfMemoryError 产生原因有以下几种: 内存中加载的数据量过于庞大,比如一次从数据库取出过多数据。 集合类中对象的引用,使用完后未清空,使得JVM不能回收。 代码中存在死循环或循环产生过多重复对象实体。 使用的第三方软件中的BUG。 启动参数设定的过小。 解决方法: 第一步,就是修改JVM启动参数,直接增加内存。 第二步,检查错误日志,查看 Out Of Memory 错误前是否有其它异常或错误。 第三步,检查代码,找出可能发生内存溢出的位置。 第四步,使用内存查看工具动态查看内存使用情况。 常见的内存溢出报错: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: java heap space 内存泄漏可以分为4类: 1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。 3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次

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

懵懂的女人 提交于 2019-11-30 17:11:35
问题说明: 公司内网环境中部署的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 root 23615 1 14 15:15 ? 00:04:45 /usr/java/jdk1 .7.0_79 /bin/java -Djava.util.logging.config. file =

Impala内存优化实战案例

前提是你 提交于 2019-11-30 16:01:48
一. 引言 Hadoop生态中的NoSQL数据分析三剑客Hive、HBase、Impala分别在海量批处理分析、大数据列式存储、实时交互式分析各有所长。尤其是Impala,自从加入Hadoop大家庭以来,凭借其各个特点鲜明的优点博取了广大大数据分析人员的欢心。 Impala 通过主节点生成执行计划树并分发执行计划至各节点并行执行的拉式获取数据的工作方式,替代了Hadoop中传统的MapReduce推式获取数据的工作方 式,计算的中间结果不写入磁盘,及时通过网络以stream的方式传递,交互性和实时性更强;Impala不花费额外的精力管理元数据,而是使用Hive 的Metastore进行元数据管理,能够直接访问存储在Hadoop的HDFS和HBase中的PB级大数据;Impala采用块的方式将元数据加载到 内存进行运算,相比Hive、HBase而言运算性能有了较大的提升;Impala提供SQL语义,相比HBase对于用户而言使用方便快捷并且简单实 用,无需其他编程语言,只需使用SQL语句即可完成复杂的数据分析任务;Impala还继承了Hadoop的灵活性、伸缩性和经济性,具有分布式本地化处 理的特性以避免网络瓶颈。 说了Impala这么多优点,难道它真是一点缺点没有的一款“完美”的分析工具吗? 非也!在一年以上的Impala海量数据分析、web应用开发实战经验中

JVM 线上故障排查基本操作

蓝咒 提交于 2019-11-30 13:13:19
#前言 对于后端程序员,特别是 Java 程序员来讲,排查线上问题是不可避免的。各种 CPU 飚高,内存溢出,频繁 GC 等等,这些都是令人头疼的问题。楼主同样也遇到过这些问题,那么,遇到这些问题该如何解决呢? 首先,出现问题,肯定要先定位问题所在,然后分析问题原因,再然后解决问题,最后进行总结,防止下次再次出现。 今天的文章,就如我们的题目一样,讲的是基本操作,也就是一些排查线上问题的基本方法。为什么这么说呢?因为线上问题千奇百怪,就算是身经百战的专家也会遇到棘手的问题,因此不可能在一篇文章里说完,还有一个最重要的原因,当然就是楼主的水平不到位。 但不到位归不到位,任何经验都是值得记录的,因此,楼主有必要将这些问题记录一下。 还有,本文的排查环境是 Linux. # 1. CPU 飚高 线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢? 思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程。然后找到那个进程中的 “问题线程”,最后根据线程堆栈信息找到问题代码。最后对代码进行排查。 如何操作呢? 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中