内存溢出

初识JVM

匆匆过客 提交于 2019-12-06 13:54:12
   一、程序计数器    记住下一条jvm指令的执行地址,解释器会去程序计数器拿jvm指令。  线程私有的,CPU会给每个线程分配时间片,时间片执行完会切换线程。    唯一不会出现内存溢出的区域。 二、虚拟机栈    线程运行需要的内存空间,每个线程都有一个栈。    由多个栈帧组成,每个方法运行需要的内存(参数、局部变量、返回值),先入后出。    每个线程只能有一个活动栈帧,就是正在执行的方法。    垃圾回收不涉及栈内存。    栈内存参数:-Xss 1024k。栈内存变大,总线程就会变少。    方法内的局部变量如果没有逃离方法的作用范围,则是线程安全的。    栈内存溢出错误:StackOverflowError     案例:     (一)CPU占用过高        1、查看所有进程的cpu占用率,获取哪个进程占用cpu最高:top。       2、查看某个进程的哪个线程占用cpu最高:ps H -eo pid,tid,%cpu | grep ${pid}。       3、查看某个进程的所有线程详细信息:jstack ${pid}。 三、本地方法栈    本地方法运行使用的内存,例如object.clone(),被native修饰的。 四、堆(heap)    通过new创建的对象都会放在堆中,线程共享的,有垃圾回收机制。    内存溢出异常:java

调用阿里云OSS未释放资源造成的内存溢出

淺唱寂寞╮ 提交于 2019-12-06 04:27:47
前段时间线上服务频繁出现内存溢出的问题,有时候半夜就会挂掉,运维同事还得从睡梦中爬起来重启,给我们带来很大的困扰。一次运维同事在快到挂掉前把jvm 的heap dump拿了下来给了我们,通过内存分析工具 MemoryAnalyzer 打开看到结果如下 可以看到有大量的org.apache.http.impl.conn.PoolingHttpClientConnectionManager 对象未被释放 ,并且可以看到是 阿里云的 oss 在引用的,灵机一动,可能是访问oss服务的时候某些资源没被释放, 但是oss的类库是公司的另一部门封装的,我们产品是直接拿来用的,那就去看看他们的源码吧。 经过查看源码发现,在每一次的oss请求都会创建一个阿里云的 OSSClient实例 ,在调用ossClient接口请求完之后并没有调用OSSClient的shutdown()方法释放资源。怪不得运行几天后内存过高不行的fullGC 直至内存溢出。反馈给另一部门之后改完我们重新打包发版, 运行观察了一段时间,再没有出现内存溢出了。真好。 来源: https://www.cnblogs.com/jasonChai/p/11961839.html

JVM内存溢出问题排查

醉酒当歌 提交于 2019-12-05 19:46:35
内存溢出问题排查,测试代码如下: import java.util.ArrayList; import java.util.List; public class Test001 { //-Xmx10m -Xmx10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/jvm.dump public static void main(String[] args) { List<User> userList = new ArrayList<>(); while (true) { userList.add(new User()); } } } 从以上的信息可以看出,空间的信息各自己占有的比例。运行完成后,我们将生成的dump文件加载到jvisualvm,我们可以通过cmd命令行进入,直接命令(jvisualvm)打开,如下图: 当我们定位到那类了以后,我们就可以去代码中查询相关代码写的是否有问题。 来源: https://www.cnblogs.com/logBlog/p/11940935.html

JVM集训-----内存结构

旧城冷巷雨未停 提交于 2019-12-05 16:28:24
摘自: https://www.cnblogs.com/lowerma/p/11929041.html JVM集训-----内存结构 一、程序计数器/PC寄存器 ( Program Counter Registe )   用于 保存当前正在执行的程序的内存地址(下一条jvm指令的执行地址) ,由于Java是支持多线程执行的,所以程序执行的轨迹不可能一直都是线性执行。当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址必然要保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。为了线程切换后能恢复到正确的执行位置, 每个线程都需要有一个独立的程序计数器 ,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存,是线程安全的。    特点:1.线程私有 2.不会存在内存溢出 二、虚拟机栈(Java Virtual Machine Stack)    虚拟机栈总是与线程关联在一起的, 每当创建一个线程,JVM就会为该线程创建对应的虚拟机栈 ,在这个 虚拟机栈中又会包含多个栈帧(Stack Frame) ,这些栈帧是与每个方法关联起来的, 每运行一个方法就创建一个栈帧 ,每个栈帧会含有一些局部变量、操作栈和方法返回值等信息。每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧,

内存溢出和内存泄漏的区别

你离开我真会死。 提交于 2019-12-05 04:58:53
1、内存溢出(out of memory)   是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 2、内存泄露( memory leak)   是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 memory leak会最终会导致out of memory! 在前面的ALLcations里面我们提到过 内存泄漏就是应该释放而没有释放的内存 。而内存泄漏分为两种: Leaked Memory 和 Abandoned Memory 。前面我们讲到了如何找到Abandoned Memory被遗忘的内存,现在我们研究的就是 Leaked Memory 。 以 发生的方式 来分类,内存泄漏可以分为4类: 常发性内存泄漏 。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 偶发性内存泄漏 。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 一次性内存泄漏 。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如

java性能优化之java web项目性能优化

丶灬走出姿态 提交于 2019-12-05 00:49:59
1、概述 对于比较大的java web工程,如果出现内存溢出,操作响应时间较长,可以看一下我的教程,这是我自己的思路和想法,大家一起学习。接下来就会列举出关于性能上常常出现的问题和解决思路和方法 2、问题及解决思路 2.1 内存溢出: 项目比较大的时候,我们操作一定时间就会报内存溢出的问题,这是常见的问题。遇到这个问题,我觉得,首先是看代码时候有错误或者死循环的,如果项目比较大并且开发完成的差不多了,显然这个方法是很费时间的,最直接有效的方法是增加jvm的内存大小,不用担心,下面会一步一步的来提高性能优化 情况一:解压版本的Tomcat, 要通过startup.bat启动tomcat才能加载配置 要添加在tomcat 的bin 下catalina.bat 里 rem Guess CATALINA_HOME if not defined set CURRENT_DIR=%cd%后面添加,红色的为新添加的. set JAVA_OPTS=-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true 情况二:安装版的Tomcat下没有catalina.bat windows服务执行的是bin/tomcat.exe.他读取注册表中的值

python pandas内存溢出:

99封情书 提交于 2019-12-05 00:14:28
pandas中read_xxx的块读取功能 pandas设计时应该是早就考虑到了这些可能存在的问题,所以在read功能中设计了块读取的功能,也就是不会一次性把所有的数据都放到内存中来,而是分块读到内存中,最后再将块合并到一起,形成一个完整的DataFrame。 def read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None): 1.chunksize是在一个每一个chunk块中有多少行。 2.当chunksize是非None的时候read_xxx返回的是一个迭代器 比如我自己的写的一个全量同步数据的代码如下: gtr=pd.read_sql_table(sync_table, data_from_engine_dict[database],chunksize=20000) count=0 for df in gtr: if count==0: df.to_sql(database+"_"+sync_table, data_to_engine, if_exists="replace", index=False) else: df.to_sql(database + "_" + sync

JVM——内存结构

。_饼干妹妹 提交于 2019-12-04 23:33:26
一、程序计数器/PC寄存器 ( Program Counter Registe )   用于 保存当前正在执行的程序的内存地址(下一条jvm指令的执行地址) ,由于Java是支持多线程执行的,所以程序执行的轨迹不可能一直都是线性执行。当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址必然要保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。为了线程切换后能恢复到正确的执行位置, 每个线程都需要有一个独立的程序计数器 ,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存,是线程安全的。    特点: 1.线程私有 2.不会存在内存溢出 二、虚拟机栈(Java Virtual Machine Stack)    虚拟机栈总是与线程关联在一起的, 每当创建一个线程,JVM就会为该线程创建对应的虚拟机栈 ,在这个 虚拟机栈中又会包含多个栈帧(Stack Frame) ,这些栈帧是与每个方法关联起来的, 每运行一个方法就创建一个栈帧 ,每个栈帧会含有一些局部变量、操作栈和方法返回值等信息。每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧, 虚拟机栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向该地址。(只有一个活动栈)

Tomcat 内存溢出及解决办法

☆樱花仙子☆ 提交于 2019-12-04 18:39:03
一、 tomcat内存设置问题 收藏 在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat、jboss,weblogic)加载jar包时会出现java.lang.OutOfMemoryError异常。这主要是由于应用服务器的内存不足引起的。这种异常常有以下几种情况(以下以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理): 1. java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space。从文字上看就是内存溢出,解决方法是加大内存。为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar,