iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Java虚拟机OOM怎么用
  • 919
分享到

Java虚拟机OOM怎么用

2023-06-02 23:06:09 919人浏览 安东尼
摘要

本文小编为大家详细介绍“Java虚拟机OOM怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java虚拟机OOM怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通过代码模拟Java虚拟机规范中描述的各个

本文小编为大家详细介绍“Java虚拟机OOM怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java虚拟机OOM怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

通过代码模拟Java虚拟机规范中描述的各个运行时区域内存溢出的场景。

首先,虚拟机启动参数配置如下:

-verbose:GC -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=81

输出:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space    at java.util.Arrays.copyOf(Arrays.java:2245)    at java.util.Arrays.copyOf(Arrays.java:2219)    at java.util.ArrayList.grow(ArrayList.java:213)    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:187)    at java.util.ArrayList.add(ArrayList.java:411)    at HeapOOM.main(HeapOOM.java:15)Heap def new generation   total 9216K, used 8920K [0x32570000, 0x32f70000, 0x32f70000)  eden space 8192K, 100% used [0x32570000, 0x32d70000, 0x32d70000)  from space 1024K, 71% used [0x32d70000, 0x32e26040, 0x32e70000)  to   space 1024K, 0% used [0x32e70000, 0x32e70000, 0x32f70000) tenured generation   total 10240K, used 5693K [0x32f70000, 0x33970000, 0x33970000)   the space 10240K, 55% used [0x32f70000, 0x334ff7f8, 0x334ff800, 0x33970000) compacting perm gen  total 12288K, used 135K [0x33970000, 0x34570000, 0x37970000)   the space 12288K, 1% used [0x33970000, 0x33991dd8, 0x33991e00, 0x34570000)    ro space 10240K, 45% used [0x37970000, 0x37df1888, 0x37df1a00, 0x38370000)    rw space 12288K, 54% used [0x38370000, 0x389f04f8, 0x389f0600, 0x38f70000)123456789101112131415161718

虚拟机栈和本地方法栈溢出

  • 1 StackOverflowError

  • 虚拟机抛出StackOverflowError异常,输出:

    Exception in thread "main" java.lang.StackOverflowError    at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:7)    at JavaVMStackSOF.stackLeak(JavaVMStackSOF.java:8) ...1234

    需要注意,为每个线程的栈分配的内存越大,反而越容易产生栈内存溢出异常。 
    这个不难理解,每个线程分配到栈容量越大,可以建立的线程数量自然就越少,建立线程时就越容易把剩下的内存耗尽。 
    因此,可以通过“减少内存”的手段来解决栈内存溢出问题。
     public class JavaVMStackOOM { private void dontStop() { while (true) {        }    } public void stackLeakByThread() { while (true) {            Thread thread = new Thread(new Runnable() { @Override public void run() {                    dontStop();                }            });            thread.start();        }    } public static void main(String[] args) {        JavaVMStackOOM oom = new JavaVMStackOOM();        oom.stackLeakByThread();    }}12345678910111213141516171819202122232425262728293031323334353637

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

    jdk 1.7开始逐步“去永久代化”。在JDK 1.6及之前的版本,由于常量池分配在永久代,可以通过-XX:PermSize和-XX:MaxPermSize限制方法区大小,从而间接限制常量池容量。

    import java.util.ArrayList; import java.util.List;  public class RuntimeConstantPoolOOM { public static void main(String[] args) { // 使用List保持常量池引用,避免Full GC回收常量池行为 List<String> list = new ArrayList<String>(); // 10MB的PermSize在integer范围内足够产生OOM int i =0; while(true) {            list.add(String.valueOf(i++).intern());        }    }}1234567891011121314151617181920212223242526

    在JDK 1.7及以上,while循环将一直进行下去。

    方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。对于这些区域的测试,基本的思想是运行时产生大量的类去填满方法去,直到溢出。
    package com.suning; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;  public class JavaMethodAreaOOM { public static void main(String[] args) { while (true) {            Enhancer enhancer = new Enhancer();            enhancer.setSuperclass(OOMObject.class);            enhancer.setUseCache(false);            enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub return proxy.invokeSuper(obj, args);                }            });            enhancer.create();        }    } static class OOMObject {    }}12345678910111213141516171819202122232425262728293031323334353637383940414243

    本机直接内存溢出

    运行结果:

    Exception in thread "main" java.lang.OutOfMemoryError at sun.misc.Unsafe.allocateMemory(Native Method)    at DirectMemoryOOM.main(DirectMemoryOOM.java:14)123

读到这里,这篇“Java虚拟机OOM怎么用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Java虚拟机OOM怎么用

本文链接: http://www.lsjlt.com/news/231656.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java虚拟机OOM怎么用
    本文小编为大家详细介绍“Java虚拟机OOM怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java虚拟机OOM怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通过代码模拟Java虚拟机规范中描述的各个...
    99+
    2023-06-02
  • Java虚拟机怎么用
    这篇文章主要讲解了“Java虚拟机怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java虚拟机怎么用”吧!Java虚拟机Java虚拟机(JavaVirtualMachine)简称JVM...
    99+
    2023-06-17
  • java虚拟主机怎么使用
    使用Java虚拟主机(JVM)可以让您在共享服务器上运行Java应用程序。以下是使用Java虚拟主机的步骤:1. 选择一个可靠的虚拟...
    99+
    2023-05-17
    java虚拟主机 虚拟主机
  • Java虚拟机有什么用
    这篇文章主要介绍Java虚拟机有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、 什么是Java虚拟机Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如...
    99+
    2023-06-03
  • 虚拟主机怎么运行java
    要在虚拟主机上运行Java,您需要确保虚拟主机上安装了Java运行时环境(JRE)或Java开发工具包(JDK)。然后按照以下步骤进...
    99+
    2023-08-31
    虚拟主机 java
  • java虚拟机是什么
    Java虚拟机(Java Virtual Machine,简称JVM)是一种能够执行Java字节码的虚拟机,它是Java程序运行的核...
    99+
    2024-04-09
    java
  • 什么是Java虚拟机
    这篇文章主要介绍“什么是Java虚拟机”,在日常操作中,相信很多人在什么是Java虚拟机问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Java虚拟机”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一、...
    99+
    2023-06-03
  • Android虚拟机中的内存分配与OOM问题详解
    目录背景知识一、Android VM的内存空间1.查看内存的API二、Android VM内存分配流程小结三、出现OOM的建议解决方案背景知识 Android中每个App默认情况下是...
    99+
    2024-04-02
  • 虚拟云主机怎么部署java
    要在虚拟云主机上部署Java应用程序,可以按照以下步骤进行操作:1. 登录到云主机的控制台或使用SSH工具连接到云主机。2. 确保云...
    99+
    2023-09-16
    虚拟云主机 java
  • Java虚拟机的Heap怎么理解
    本篇内容介绍了“Java虚拟机的Heap怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Java虚拟机中,我是一个位高权重的大管家,...
    99+
    2023-06-02
  • 云虚拟主机怎么部署java
    要在云虚拟主机上部署Java,您可以按照以下步骤进行操作:1. 登录到您的云虚拟主机。2. 安装Java Development K...
    99+
    2023-08-31
    云虚拟主机 java
  • Java虚拟机是怎么工作的
    这篇文章主要介绍“Java虚拟机是怎么工作的”,在日常操作中,相信很多人在Java虚拟机是怎么工作的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java虚拟机是怎么工作的”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-03
  • 使用java虚拟主机怎么搭建网站
    使用 Java 虚拟主机搭建网站需要以下步骤:1、获取 Java 虚拟主机选择合适的 Java 虚拟主机服务商,注册账号并购买 Ja...
    99+
    2023-03-20
    java虚拟主机 虚拟主机
  • Java虚拟机怎么利用JVM进行优化
    本篇文章为大家展示了Java虚拟机怎么利用JVM进行优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言Java虚拟机是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最...
    99+
    2023-05-31
    java jvm ava
  • python虚拟机怎么使用
    python 字节码设计一条 python 字节码主要有两部分组成,一部分是操作码,一部分是这个操作码的参数,在 cpython 当中只有部分字节码有参数,如果对应的字节码没有参数,那么 oparg 的值就等于 0 ,在 cpython 当...
    99+
    2023-05-15
    Python
  • 云虚拟机怎么使用
    云虚拟机的使用方法:1、打开云虚拟机管理面板,查看主机信息;2、安装并启动FTP软件,新建站点;3、新建站点完成后,通过远程连接站点,并将网站程序上传至云虚拟机网站根目录中;4、将数据库连接配置到网站项目中;5、最后将数据备份导入云虚拟机中...
    99+
    2024-04-02
  • 虚拟机怎么使用https
    通过在虚拟机根目录下的web.config文件中添加以下配置即可使用https,具体方法如下:<xml version="1.0" encoding="UTF-8"><configu...
    99+
    2024-04-02
  • Java中怎么避免OOM
    Java中怎么避免OOM,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.了解 强引用、软引用、弱引用、虚引用的概念在Java中,虽然不需要程序员手动去管理对象...
    99+
    2023-06-17
  • 怎么在虚拟主机中运行java
    怎么在虚拟主机中运行java?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发...
    99+
    2023-06-14
  • 虚拟主机怎么部署java项目
    要在虚拟主机上部署Java项目,可以按照以下步骤进行操作:1. 确保虚拟主机上已安装Java运行环境(JRE)或Java开发工具包(...
    99+
    2023-08-26
    虚拟主机 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作