首页 > 系统相关 >内存溢出分析

内存溢出分析

时间:2022-08-24 23:45:10浏览次数:79  
标签:分析 String void static 内存 public 溢出

溢出区域

  内存溢出分为堆内存溢出和栈内存溢出   如果虚拟机在扩展堆时无法申请到足够大的内存空间时,就会抛出outOfMemoryError   如果线程请求的栈深度大于虚拟机所允许的最大深度,则抛出StackOverflflowError

栈溢出

public class TestOverFlow {
    public static void main(String[] args) {
        pop();
    }
    public static void pop(){
        pop();
    }
}

 

堆溢出

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        while (true) {
            list.add("Hello");
        }
        //pop();
    }

 

  为了更好检测和查看溢出原因在运行前先设置jvm参数   -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/xianghan/Desktop/bak -Xmx2m -Xms2m   jvm参数含义请参考:https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
  生成的二进制文件格式为hprof,可以使用jprofifile打开分析具体导致异常的代码

线程数过多导致堆溢出

PS:此代码慎执行!!!! !!!在执行前一定小心保存当前工作内容,防止机器卡死
    public static void main(String[] args) { 
        try {
            while (true){ 
                Thread thread=new Thread(new Runnable() { 
                    @Override 
                    public void run() { 
                        while (true){ 
                            
                        }
                    } 
                }); 
                System.out.println(thread.getName()); 
                thread.start(); 
            } 
        } catch (Exception e) {
            e.printStackTrace(); 
        } 
    }

常量池溢出

    // -Xmx10m -Xms10m
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        int i = 0;
        while (true) {
            list.add(String.valueOf(i++).intern());
        }
    }
String.intern()是一个Native方法,它的作用是:如果字符串常池中已包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象,否则将此String对象包含的字符串添加到常池中,并且返回此string对象的引用。在JDK1.6及之前的版本中,由于常池分配在永久代内,我们可以通过-XX:PermSize=10M -XX:MaxPermSize=10M。MaxPermSize限制方法区大小从而间接限制其中常量池的容量。

本机直接内存溢出

如果不指定MaxDirectMemorySize那么直接内存与堆内存一样大    PS:运行此代码风险较大直接死机
    public static int _1MB=1024*1024; //-Xmx20M -XX:MaxDirectMemorySize=10M 
    public static void main(String[] args) throws Exception{ 
        Field unsafeField= Unsafe.class.getDeclaredFields()[0]; 
        unsafeField.setAccessible(true);
        Unsafe unsafe =(Unsafe) unsafeField.get(null); 
        while (true){ 
            unsafe.allocateMemory(_1MB); 
        } 
    }

 

标签:分析,String,void,static,内存,public,溢出
From: https://www.cnblogs.com/xinay/p/16622656.html

相关文章

  • Wireshark网络分析就这么简单 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1ZCsm5DpSrEU2jVM5ZruXIg点击这里获取提取码 Wireshark可能是世界上最好的开源网络包分析器,能在多种平台上(比如Windows、L......
  • Wireshark数据包分析实战 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1f_ONlxxKzowe86LuIu6Pvw点击这里获取提取码《Wireshark数据包分析实战(第2版)》从网络与数据包分析的基础知识开始,渐进地介......
  • Wireshark网络分析的艺术 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1cAWKzic9t9nHu7HzFW0xnA点击这里获取提取码Wireshark是当前流行的网络包分析工具。它上手简单,无需培训就可门。很多棘手的网......
  • 前端知识之CSS(3)-盒子模型、浮动布局、溢出属性、定位、脱离文档流、z-index之模态框
    目录盒子模型浮动布局(float)1.什么是浮动2.浮动的作用3.浮动有俩个特点4.浮动(float)格式5.浮动会造成父标签塌陷这是一个不好的现象因为会引起歧义6.解决父标签塌陷问题溢......
  • 内存数据库的自动优化怎么做?
    以柏睿数据内存分布式数据库RapidsDB来说明的话,自动优化体现在2个阶段:数据入库过程和数据入库后。我这里重点分享一下数据入库后。基本实现手段如下:我们都知道如果表中的......
  • arm linux虚拟内存布局【转】
    转自:https://blog.csdn.net/sxw1002/article/details/52841762Documentation/arm/memory.txt中的描述:开始位置 结束位置 使用0xffff8000 0xffffffff 用于copy_user_page......
  • 案例分析&环境搭建、maven概述
    案例分析&环境搭建案例需求:1,提供index.html页面,页面中有一个省份下拉列表2.当页面加载完成后发送ajax请求,加载所有省份   maven概述maven是什么项目管理工具M......
  • 内存池
    importscala.collection.mutableimportscala.io.StdInimportutil.control.Breaks._objecttest{defmain(args:Array[String]):Unit={//获取输入......
  • 用 Wireshark 分析 TCP 吞吐瓶颈
    https://www.kawabangga.com/posts/4794Debug网络质量的时候,我们一般会关注两个因素:延迟和吞吐量(带宽)。延迟比较好验证,Ping一下或者 mtr 一下就能看出来。这篇文章分......
  • 新字符设备驱动原理和框架源码分析
    一、分配和释放设备号动态申请设备号:/*dev:设备号--dev_tdevid;count:是要申请的数量,一般都是一个;name:是设备名字*/intalloc_chrdev_region(dev_t*dev,uns......