首页 > 编程知识 正文

java面试题jvm调优,jvm内存溢出之前要dump文件

时间:2023-05-04 13:55:31 阅读:25460 作者:4333

) Java中将内存溢出分为堆栈内存溢出和堆栈内存溢出,但一般情况下,某个Java APP应用程序中发生内存溢出是指堆栈内存溢出,即OOM。 与内存错误java.lang.OutOfMemoryError异常(错误)相对应的堆栈内存溢出为java.lang.StackOverflowError异常;

(2) Java中每个线程都有堆栈区域(堆栈内存),可以通过JVM参数-Xss256k设定线程堆栈区域的大小。 线程堆栈空间还具有堆栈帧的概念,每当在线程上调用方法时,都会插入堆栈帧。 例如,如果主线程执行main方法,则main方法是主线程的堆栈帧,而在main方法中调用test (方法时,主线程又插入新的堆栈帧并进行test ) ) 方法执行完成后,例如,当test ()方法执行完成时,线程将弹出相应的堆栈帧。 这意味着释放由方法创建的变量占用的堆栈内存。

3 )通常不太可能发生堆栈内存溢出。 堆栈帧的存在,以及一种方法基本上不会产生几千行行。 此外,由于堆栈中存储的数据基本上是int、double、引用等变量类型,堆栈内存溢出发生基本上与递归函数有关。

JVM没有用于设置堆栈内存溢出后操作的设置参数,不需要。 在堆栈溢出错误异常堆栈中,可以知道哪些函数/方法是导致堆栈内存溢出的原因。 (每个线程都有堆栈空间。 )

无法确定堆内存溢出是以何种方式发生在内存溢出异常堆栈上的。 例如,-Xmx2g的APP应用程序,以及a线程的一些方法通过创建变量使用1g,而b线程的一些方法使用0.95g。 此时,c线程的执行方法会创建一些对象,使其超过2g

很明显,异常堆栈信息也是c线程的几个方法,但很明显,不能完全说是c线程的方法导致了OOM,因为在OOM发生时,异常明显是由c线程的方法抛出的;

(四)堆内存溢出情况创建了大量类,但这些类仍在使用,gc重用时无法回收,最终持续创建对象时会发生堆内存溢出;

如果发生内存错误OutOfMemoryError错误,请分析支持dump的堆内存在使用数据并使用名为jvisualvm.exe的jdk工具生成OOM时创建的每个类的数量、内存占用量和所属线程等信息,然后单击

配置参数为- xx : heapdumponoutofmemoryerror-xx : heap dump path=/opt/apps/xx-service; 第一个表示OOM生成后dump.hprof文件,第二个表示dump文件存储在哪个目录中

通过配置- xx : onoutofmemoryerror='/opt/apps/xx-service/xx.sh ',在生成OOM时在抛出此OOM之前执行后续命令/脚本

通过配置-XX: ExitOnOutOfMemoryError,还可以在发生OOM时自动关闭程序。 如果与上述一起配置,则此优先级最低。 也就是说,请注意,dump文件将创建,命令也将执行,然后APP应用程序将关闭。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。