jvm(2)-OutOfMemoryError 异常(内存溢出异常)

【0】README
0.1)本文转自 深入理解 jvm, 旨在学习 OutOfMemoryError 异常(内存溢出异常) 的触发类型;

0)准备知识
0.1)除了程序计数器外,虚拟机内存的其他几个运行时区域(方法区+虚拟机栈+本地方法栈+java堆)都有发生 OutOfMemoryError异常的可能性;
0.2)如何设置Eclipse 的 VM 参数?

1)java堆内存溢出异常测试
1.1)运行结果(运行参数 -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError)
package com.jvm.chapter2;import java.util.ArrayList;
import java.util.List;/*** VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError* @author zzm*/
public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list = new ArrayList<OOMObject>();while (true) {list.add(new OOMObject());}}
}<strong>
</strong>
1.2)solution: 通过内存映像分析工具(如 Eclipse Memory Analyzer) 对 dump(转储) 出来的堆转储快照进行分析,重点是确认内存中的对象是否是有必要的,也就是要先分清楚是出现了内存泄露(Memory Leak) 还是内存溢出(Memory Overflow);

2)虚拟机栈和本地方法栈溢出
2.1) HotSpot 虚拟机中并不区分虚拟机栈和本地方法栈;
2.2)使用 -Xss 参数减少栈内存容量。结果: 抛出StackOverflowError 异常,异常出现时输出的堆栈深度相应缩小;
2.3)运行结果:(运行参数 -Xss128k)
package com.jvm.chapter2;/*** VM Args:-Xss128k* @author zzm*/
public class JavaVMStackSOF {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) throws Throwable {JavaVMStackSOF oom = new JavaVMStackSOF();try {oom.stackLeak();} catch (Throwable e) {System.out.println("stack length:" + oom.stackLength);throw e;}}
}
2.4)定义了大量的本地变量,增大此方法帧中本地变量表的长度。结果: 抛出StackOverflowError 异常时输出的堆栈深度相应缩小;

3)方法区和运行时常量池溢出
3.0)String.intern() :是一个Native方法,它的作用是: 如果字符串常量池中已经包含一个等于此String 对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String 对象 的引用;
3.1)由于常量池分配在永久代内,通过 -XX:PermSize 和 -XX:MaxPermSize 限制方法区大小,从而间接限制其中常量池的容量;
3.2)运行参数(-XX:PermSize=10M -XX:MaxPermSize=10M)
Attention)没有抛出异常,因为 
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=1M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=1M; support was removed in 8.0

3.3)测试 String.intern方法:
package com.jvm.chapter2;public class RuntimeConstantPoolOOM
{public static void main(String[] args){String str1 = new StringBuilder("中国").append("钓鱼岛").toString();System.out.println(str1.intern() == str1);// trueString str2 = new StringBuilder("ja").append("va").toString();System.out.println(str2.intern() == str2);// false}
}
对上图的分析)Analysis:
A1)在jdk 1.6中,会得到两个false。   因为在 jdk1.6中,intern 方法会把首次遇到的字符串实例copy 到永久代中,返回的也是永久代中这个字符串市实例的引用,而StringBuilder 创建的字符串实例在 java堆上,所以必然不是同一个引用;
A2)在jdk1.7中,会得到一个true和一个false。因为在 jdk1.7中的 intern 方法不会copy实例,只是在常量池中记录首次出现的实例引用,因此intern() 方法的引用和由StringBuilder 创建的那个字符串实例是同一个。对str2 比较返回false 是因为“java”这个字符串在执行 StringBuilder.toString()之前已经出现过了,字符串常量池已经有它的引用了,不符合“首次出现原则”,而“计算机软件”这个字符串则是首次出现,因此返回true;

4)本机直接内存溢出
4.1)DirectMemory容量: 可以通过-XX:MaxDirectMemorySize 指定,如果不指定,则默认与java 堆最大值(-Xmx指定)一样;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java oca_OCA第7部分中的Java难题

java oca在OCA系列的Java Puzzlers的这一部分中&#xff0c;我将展示定义字符串和与之相关的潜在惊喜的多种方法。 创建字符串的两种基本类型是使用new关键字和仅使用字符串文字来创建。 String strWithNew new String( "hey" ); String strWithLiteral "ho&…

Java GC总结

一、gc两大基本算法1、引用计数法 2、根搜索法 二、gc改进收集算法 1、标记-清除算法 2、复制算法 3、标记-整理算法 分代收集算法 三、gc的类型 串行垃圾回收器&#xff08;Serial Garbage Collector&#xff09; 并行垃圾回收器&#xff08;Parallel Garbage Collecto…

让CentOS能用yum自动安装rar和unrar

【0】README 0.1&#xff09;本文转自&#xff1a; http://www.centoscn.com/CentOS/config/2015/0520/5485.html 目的&#xff1a;让CentOS能用yum自动安装rar和unrar 系统环境&#xff1a; CentOS 7.0 具体操作步骤如下&#xff1a; 1.编辑文件 编辑dag.repo文件&#xff0c…

java oca_OCA第6部分中的Java难题

java oca即使对于新的Java开发人员&#xff0c;构造函数也可能不是什么大谜。 本质上&#xff0c;当您创建一个类的实例时&#xff0c;该类的构造函数就会启动。 在Java Puzzlers系列的第6部分中&#xff0c;我们将看到一个与构造函数有关的案例。 public class Puzzler { publ…

Java 内存泄露总结

一、Java内存泄漏引起的原因&#xff1a;内存泄漏是指无用对象&#xff08;不再使用的对象&#xff09;持续占有内存或无用对象的内存得不到及时释放&#xff0c;从而造成内存空间的浪费称为内存泄漏。 二、内存泄露的方式 1、静态集合类引起内存泄漏 像HashMap、Vector等的使…

使用Mockito的Mock Void方法

大家好&#xff01; 在我们之前的博客关于thenReturn和thenAnswer模拟方法之间的区别之后 &#xff0c;我们又回来了关于Mockito的另一个有趣的博客。 在这里&#xff0c;我们将讨论“如何用Mockito模拟无效方法”。 让我们开始吧&#xff01; 在编写代码时&#xff0c;总是至…

System.gc()调用 - 适用的场景

一、System.gc()调用 System.gc()用于调用垃圾收集器&#xff0c;在调用时&#xff0c;垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。然而System.gc&#xff08;&#xff09;调用附带一个免责声明&#xff0c;无法保证对垃圾收集器的调用。我们…

将模板方法模式应用到kmeans聚类算法

【0】README 0.1&#xff09;本文描述和源代码均为原创&#xff0c;旨在说明 如何将模板方法模式应用到kmean聚类算法&#xff1b; 0.2&#xff09;模板方法模式的intro&#xff0c; 参见 模板方法模式 0.3&#xff09;for kmeans alg source code, please visit kmeans&a…

java oca_OCA第4部分中的Java难题

java oca在Java Puzzlers的第四部分中&#xff0c;我们有一些与char类型有关的东西。 public class Puzzler { public static void main(String[] args){ char myChar a ; myChar; System.out.println(myChar); } } 您可能已经猜到了。 它将打印“ b”&#xff0c;其原因是c…

毕业设计的十大问题

一、vue的跨域问题 1、前端本地用代理软件代理服务器 在vue项目下的 config/index.js 文件里面配置代理proxyTable:proxyTable: {/login: {target: http://192.168.1.1:8080/ntd/data,changeOrigin: true,pathRewrite: {^/login:}}2、后台服务器开启允许跨域的响应头 直接在tom…

设计模式入门(策略模式)

【0】README0.1&#xff09;本文部分文字描述转自 “head first 设计模式”&#xff0c;旨在学习 设计模式入门&#xff08;策略模式&#xff09; 的基础知识&#xff1b;0.2&#xff09;本文章节4和5的source code&#xff0c;参见 设计模式——策略模式源代码【1】看个荔枝&a…

java oca_OCA的Java拼图游戏第3部分

java oca在Java难题的第三部分中&#xff0c;我们将看到变量命名限制方面的惊喜。 如果我向您展示了这一点&#xff0c;那么我相信您不会因为它无法编译而感到惊讶。 静态是保留关键字之一&#xff0c;为什么它应该起作用&#xff1f; public class Puzzler {public static v…

maven安装遇到的坑

一、环境变量设置没有反应 cmd窗口的设置未更新&#xff0c;需重新开启cmd窗口 二、缺失包 默认加载maven的仓库 配置minor导致官方的Maven库下载不了

单件模式(单例模式)

【0】README0.1&#xff09;本文部分描述转自 “head first 设计模式”&#xff0c; 旨在学习 单件模式&#xff08;单例模式&#xff09; 的相关知识 及其应用&#xff1b;【1】单件模式1.0&#xff09;单件模式的应用背景&#xff1a;有一些对象其实我们只需要一个&#xff0…

java oca_OCA第5部分中的Java难题

java oca在Java Puzzlers系列的第五部分中&#xff0c;我们将看到与X.parseX&#xff08;String s&#xff09;方法相关的内容。 您可以看到我们对X.parseX&#xff08;&#xff09;方法的期望。 public class Puzzler { public static void main(String[] args){ int i Inte…

Java Excel导出

一、Excel依赖包POI &#xff08;1&#xff09;Maven配置<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.7</version></dependency> &#xff08;2&#xff09;jar下载地址http://poi…

junit4和junit5_JUnit5 TestSuite替代

junit4和junit5JUnit4具有TestSuite类来聚合多个测试。 这在JUnit 5中不可用。通常&#xff0c;通过套件中的一堆命名测试进行的测试发现有些糟透了。 但是&#xff0c;如果目标不是测试发现&#xff0c;而是不同测试类之间的资源共享&#xff0c;那么创建一个父对象是有意义的…

Redis入门(一)之安装

一、下载Redis &#xff08;1&#xff09;Window 下载地址&#xff1a;https://github.com/MSOpenTech/redis/releases &#xff08;2&#xff09;Linux 下载地址&#xff1a;http://redis.io/download 二、安装Redis &#xff08;1&#xff09;window版本 A.解压Redis的zi…

mockito参数匹配_Mockito匹配器优先

mockito参数匹配这篇文章是意见。 让我们看一下Mockito中用于在Java中进行测试的verify方法。 示例&#xff1a; verify(myMock).someFunction(123) –期望在模拟ONCE上使用输入123调用someFunction 。 BDDMockito &#xff0c;我更喜欢完整的BDDMockito替代方案&#xff0c…

Redis入门(二)之数据类型

一、Redis 数据类型 Redis支持五种数据类型&#xff1a; &#xff08;1&#xff09;string&#xff08;字符串&#xff09; &#xff08;2&#xff09;hash&#xff08;哈希&#xff09; &#xff08;3&#xff09;list&#xff08;列表&#xff09; &#xff08;4&#x…