Java堆溢出

Java堆存的是对象的实例,所以无限添加对象实例很容易造成堆溢出

public class OutOfMemoryError_Heap {static class OOMObject{}public static void main(String[] args) {List <OOMObject> list = new ArrayList<OOMObject>();while(true) {list.add(new OOMObject());}}
}

添加虚拟机参数
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/jj/Desktop
a)Xms20m 堆最小值
b)Xmx20m 堆最大值
c)HeapDumpOnOutOfMemoryError 内存堆转储快照
d)XX:HeapDumpPath=/Users/jj/Desktop 快照存放地址

结果:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to /Users/jj/Desktop/java_pid584.hprof ...
Heap dump file created [27568513 bytes in 0.137 secs

使用MAT内存分析工具分析生成的快照可以看到

Shallow Heap是指对象本身占有的内存大小。
Retained Heap是指对象本身加上它引用的对象的大小。
这里OOMObject 的Shadow Heap和Retained Head相同的原因是OOMObject没有引用;而他是16的原因是对象头在64位机器上占有64bit,也就是16个字节,但是由于虚拟机自动使用压缩指针,所以占有12个字节,但是又由于对象占有的内存必须为8的倍数,所以最后结果是16字节。
字节长度计算的方式是 12+类型长度和->最接近8倍数的数字->结果

虚拟机栈和本地方法溢出

栈内存太小和已使用的栈空间太多都会导致虚拟机栈或本地方法溢出。

a)栈溢出


public class JavaVMSStack {private int stackLength =1 ;public void JavaVMSStack() {stackLength ++ ;JavaVMSStack();}public static void main(String[] args) {JavaVMSStack j = new JavaVMSStack();try {j.JavaVMSStack();} catch (Exception e) {System.out.println(j.stackLength);throw e;}}
}

虚拟机参数
-Xss160k

b)内存溢出

我们知道,虚拟机会为每个线程的栈先分配一段可以调整的内存,每个线程分配到的栈帧越大,可以建立的线程就越少,建立线程时就越容易把剩下的内存耗尽。


public class JavaVMSStackOOM {private void dontStop() {while (true) {}}public void stackLeakByThread() {while (true) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {dontStop();}});thread.start();}}public static void main(String[] args) {JavaVMSStackOOM oom = new JavaVMSStackOOM();oom.stackLeakByThread();}
}

虚拟机参数:

-vss20M

在Windows平台的虚拟机中,Java的线程是映射到虚拟机的内核上的,隐私上述代码执行时有较大的风险,可能会导致系统假死。

方法区和运行时常量池溢出

运行时常量池是方法区的一部分。
在jdk1.6以前,由于常量池位于永久代中,而我们可以通过参数去限制方法区的大小,所以间接影响到常量池的容量。
而jdk1.7以后, 已经把原本放在永久代的字符串常量池移出, 放在Java堆中(元空间Metaspace)中,元数据并不在虚拟机中,使用的是本地的内存。

可以通过以下参数来指定元空间的大小:
  
  -XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

 -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。

OutOfMemory (OOM)的类型与检测相关推荐

  1. NAT类型及检测方法

    一 NAT的类型 NAT可以分为很多种,但是最为普遍的是传统NAT,或者称为向外NAT.向外NAT在默认情况下只允许向外的Session穿越NAT,这就是我们最为常见的情况. 这种向外NAT又可以分为 ...

  2. php 检测变量中的回车键_PHP 的变量类型,变量检测

    1.PHP的变量类型: 整型       浮点型 字符串 布尔型 数组 对象 null 资源类型 一个变量就是一个盒子,类型可以看做盒子的标签,变量的值就是盒子里的内容 null 是没有类型的空盒子, ...

  3. [转]NAT类型与检测

    NAT类型与检测 一.NAT分类 Full Cone NAT(完全圆锥型) Address Restricted Cone NAT(地址限制圆锥型) Port Restricted Cone NA ...

  4. NAT 类型及检测方法

    NAT 类型及检测方法 STUN协议是一个客户机/服务器协议,在公网上存在着大量的STUN服务器,用户可以通过在自己主机上运行STUN客户端远程连接STUN服务器来确认自身的网络状况. 客户端主机所在 ...

  5. (转载)Linux Out-of-Memory(OOM) Killer

    Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释 ...

  6. Linux 的 Out-of-Memory (OOM) Killer

    同事在 Linux 服务器上遇到点小问题,我也上去折腾半天.这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer .说白了 OOM Killer 就是一层保护机制,用于避免 L ...

  7. 绕过content-type检测文件类型上传webshell

    声明:以下内容均来自"实验吧"免费公益渗透平台,该平台至今仍旧在维护,估计~~,为此把以前保留的笔记拿来分享下. [实验目的]    1) 理解绕过Content-Type检测文件 ...

  8. 用计算机采集卡检测压力传感器信号故障,计算机联网检测系统应用研究

    [摘要]计算机联网检测技术在机动车检测方面应用广泛.文章介绍计算机联网检测系统的类型及检测原理,探讨系统的维护.使用及故障诊断的技术与方法. [关键词]计算机联网机动车检测应用 计算机联网检测系统是电 ...

  9. 1.8M超轻量目标检测模型NanoDet,比YOLO跑得快

    机器之心报道,项目作者:RangiLyu 目标检测一直是计算机视觉领域的一大难题,其目标是找出图像中的所有感兴趣区域,并确定这些区域的位置和类别.目标检测中的深度学习方法已经发展了很多年,并出现了不同 ...

最新文章

  1. Transformers资料汇总!从原理到应用
  2. java 值类型与引用类型_JAVA 关于值类型和引用类型的区别
  3. bootstrap之排版类
  4. 低代码是什么?有什么优势
  5. 嘉年华回顾丨阿里云吕漫漪带你一览POLARDB整体架构设计...
  6. c99什么意思_C语言中-是什么意思啊?
  7. C语言一维数组实现杨辉三角,一维数组实现杨辉三角
  8. flask异步操作_从Flask到FastAPI的平滑迁移
  9. 好看的php表格样式,HTML5制作表格样式
  10. scrapy中文文档基础知识
  11. 基于springBoot+MyBatis+Vue的前后端分离旅游管理系统
  12. 解决微信调整字体大小导致页面样式混乱的问题
  13. python 矩阵元素平方_NumPy之计算两个矩阵的成对平方欧氏距离
  14. 动词记忆(1):ate,ify,ish后缀常用词
  15. python for循环写法_python中多重循环的写法
  16. 《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理
  17. 老字号“张小泉”上线小程序与酷客多达成战略合作!
  18. 大厂程序员的一天是如何度过的?
  19. linux两个进程同时打开串口,linux串口操作及设置详解
  20. 运维常说的 5个9、4个9、3个9 的可靠性,到底是什么鬼?

热门文章

  1. 外挂学习之路(4)--- 大海捞针找call call const法
  2. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----UDP篇
  3. GetLongPathName和GetShortPathName函数
  4. EV3 直接命令 - 第 2 课 让你的 EV3 做点什么
  5. Linux内存占用分析的几个方法,你知道几个?
  6. 以高并发著称的 Go 如何与 MySQL 搭档应对千亿级数据?
  7. 【从上云到创新,视频云的新技术与新场景】
  8. QoE驱动的端到端视频直播技术演进
  9. solr中文搜索倒排索引和数据存储结构
  10. C++之TR1::function