编写Java代码制造一个内存溢出的情况

Java OutOfMemory异常清单 —— 在自己的机器上制造内存溢出 既然我们知道各个内存区域存储的内容,那么只要在代码上做一些手脚,就可以制造出OutOfMemory异常,这就是我们这一讲要做的事。 阅读详情

编写Java代码制造一个内存溢出的情况

 这将会是一篇比较邪恶的文章,当你想在某个人的生活中制造悲剧时你可能会去google搜索它。在java的世界里,内存溢出仅仅只是你在这种情况下可能会引入的一种bug。你的受害者会在办公室里度过几天甚至是几周的不眠之夜。

在这篇文章中我将会介绍两种溢出方式,它们都是比较容易理解和重现的。并且它们都是来源现实项目的案例研究,但是为了让你清晰地掌握,我把它们简化了。

不过放心,在我们遇到和解决了很过溢出bug之后,类似的案例将会比你想象得更加普遍。

先来一个进入状态的,在使用HashSet/HashMap时,所用键值没有或者其equals()/hashCode()方法不正确,这会导致一个臭名昭著的错误。

class KeylessEntry {

static class Key {

Integer id;

Key(Integer id) {

this.id = id;}

@Override

public int hashCode() {

return id.hashCode();}}

public static void main(String[] args) {

Map m = new HashMap();

zQXRuVnqo while (true)

for (int i = 0; i < 10000; i++)

if (!m.containsKey(i))

m.put(new Key(i), "Number:" + i);}}

当你运行上面的代码时,你可能会期望它运行起来永远不会出问题,毕竟内置的缓存方案只会增加到10,000个元素,然后就不会再增加了,所有的key都已经出现在 HashMap中。然而,事情并非如此。元素将会一直增长, 因为Key这个类没有在hashCode()后实现一个合适的equals()方法。

解决方法很简单,只要和下面的示例一样添加一个equals方法就可以了。但是在找到问题所在之前,你肯定已经花费了不少宝贵的脑细胞。

@Override

public boolean equals(Object o) {

boolean response = false;

if (o instanceof Key) {

response = (((Key)o).id).equals(this.id);}

return response;}

下一个你得提醒朋友的是和String处理相关的操作。它的表现会很诡异,特别是结合JVM版本差异的时候。String的内部工作机制在 JDK 7u6中被改变了,所以如果你发现产品环境只是小版本号的区别,那么你已经准备好条件了。把类似下面的代码给你的朋友调试,然后问他为什么这个bug只会在产品中出现。

class Stringer {

static final int MB = 1024*512;

static String createLongString(int length){

StringBuilder sb = new StringBuilder(length);

for(int i=0; i < length; i++)

sb.append('a');

sb.append(System.nanoTime());

return sb.toString();}

public zQXRuVnqostatic void main(String[] args){

List substrings = new ArrayList();

for(int i=0; i< 100; i++){

String longStr = createLongString(MB);

String subStr = longStr.substring(1,10);

substrings.add(subStr);}}}

上面的代码出了什么问题呢?当它在JDK 7u6之前的版本上运行的时候,返回的字符串将会保存一个对那个1M左右大小的字符串的引用,如果你运行的时候设置为-Xmx100m,你会得到一个意想不到的oom错误。结合你实验环境中平台和版本的差异,伤脑经的事情就产生了。

现在如果你想掩盖你的足迹,我们可以引进一些更加高级的概念。比如

在不同的类加载器中载入有破坏性的代码,在加载的类被原始类加载器删除后保持对它的引用,可以模拟一个类加载器溢出

    把攻击性的代码隐藏在finalize方法中,使得程序表现变得不可预测

    在一个长期运行的线程中加入棘手的组合,它可能在ThreadLocals中保存了一些可以被线程池访问的东西,以便管理应用线程。

我希望我们给了你一些思考的原材料以及当你想修理某人时的一些素材。这将带来无穷无尽的调试。除非你的朋友使用 Plumbr来查找溢出的所在地。

dToF直方图之美 上面视频里如果你能看懂,那么就能理解对于dToF单点的测距问题,对于大部分的描述在AMS和ST里的手册都非常的详细,有疑问的可以后台来找我探讨,今天我们单纯从上层讨论成像的问题。作为dToF算法工程师,应该是对直方图敏感的,直方图的每个Count峰都会表征出问题,因为dToF的输出只有直方图,观察直方图能够逆推出dToF的很多东西,这也是大多数公司不愿意开放直方图和Raw data的缘故。以上是一个小面阵的分辨率,第一张是直方图,后面是基于直方图寻峰出来的成像ToF图,Peak图,以及噪声Noise图。 阅读详情

相关推荐

香橙派R1 Plus LTS变身无线AP/客户端:手把手教你用RTL8811CU和MT7601U网卡刷OpenWRT

本文详细介绍了如何将香橙派R1 Plus LTS开发板通过RTL8811CU和MT7601U两款USB无线网卡刷入OpenWRT系统,实现无线AP热点发射与客户端接入的双重功能。从硬件选型、驱动安装到双网卡协同配置,提供完整的实战指南,帮助用户快速搭建稳定高效的无线网络解决方案。

weixin_30919429的博客 408

实现jvm内存溢出

实现内存溢出

weixin_70280523的博客 892

SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程

SAP创建下达报工入库发料以及取消发料取消入库,批量下达删除关闭,生产订单出入库查询和状态更改查询记录

weixin_38974136的博客 2万+

用代码实现一个内存溢出

概念 内存泄漏Memory Leak:是指程序在申请内存后,无法释放已经获取的内存;一次内存泄漏似乎没什么影响,但是多次堆积后会发生内存溢出 内存溢出Out of Memory:是指程序在运行时获取内存,没有足够的内存供请求者请求 注:在java虚拟机中,除了程序计数器,其他几个运行时区域都有可能发生内存溢出 Java堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且保证GC避免清除这些对象,那么随着总容量到达堆的最大容量就会产生内存溢出 代码实现堆溢出(提前设置好XMS和XMX) stati

weixin_48304611的博客 2981

人像抠图 + OpenGL ES 还能这样玩?没想到吧(附带源码)

OpenGL ES 利用抠图算法实现人像留色。

字节流动 3万+

把 SAP Activate 六个阶段看透:从项目落地到 SAP BTP 扩展与 AI 运营的一体化实践

摘要: SAP Activate 方法论常被误解为简单的项目阶段划分,实则是一套将业务目标、标准流程、系统配置和持续运营串联的实施控制体系。其六个阶段(Discover至Run)构成价值递进的实施通道,核心交付集中在Prepare到Deploy阶段。Discover阶段通过DDA评估确立项目方向与范围,Prepare阶段聚焦可执行性准备,Explore阶段采用Fit-to-Standard工作坊进行需求分层,Realize阶段基于前期决策进行配置与扩展开发。该方法论强调标准化优先,差异化需求通过SAP BT

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2332

今天来聊一聊JVM中的内存溢出和内存泄露

在Java开发中,JVM内存溢出和内存泄露是常见的问题。内存溢出是由于Java程序运行时申请的内存超出了JVM所能提供的内存大小,解决方法是通过增加JVM参数或者优化程序逻辑。内存泄露是由于Java程序中的对象占用了内存,但是无法被GC回收,解决方法是通过释放对象引用或者优化程序逻辑。在开发过程中,需要对JVM内存进行监控,及时发现和解决问题,保障程序的稳定性和可靠性。

Dark_orange的博客 1789

基于 Simulink 的固态变压器(SST)多级协同控制实战教程

《固态变压器多级协同控制仿真指南》摘要: 本教程详细讲解了基于Simulink的固态变压器(SST)三级架构建模与控制方法。核心内容包含:1)搭建级联H桥整流(CHB)、双有源桥(DAB)和逆变器(VSI)的三级主电路;2)提出创新的多级协同控制策略,通过功率前馈实现输入输出级动态匹配;3)给出系统级功率平衡、单元级均压控制的具体实现方案。教程特别强调解决实际工程中的关键问题:代数环处理、软启动设计和刚性系统求解器选择,并提供了硬件在环(HIL)仿真建议。附带的MATLAB代码示例可直接用于实现电容电压均衡

xiaoheshang_123的博客 120

JAVA内存溢出的常见原因及代码示例

标题 堆溢出 堆是java程序中最为重要的内存空间,绝大部分的内存溢出都属于这种情况。其原因是因为大量对象占据了堆空间,而这些对象都持有强引用,导致无法回收。当对象大小之和大于有Xmx参数指定的堆空间大小时,就会发生堆溢出。 代码示例: public class OOM { public static void main(String[] args) { //堆溢出 List<b...

liuhongya328的博客 1475

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2020

在lio_sam中融入GPS

在LIO(激光惯性里程计)系统中,将GPS信息融合到里程计中,借助GTSAM(Georgia Tech Smoothing and Mapping)库进行因子图优化,可以有效提升全局定位精度。当进入到GPS信号不好或缺失的环境中,需要借助融合后的里程计反算经纬度,来获取高精度的定位信息。利用GeographicLib第三方库将经纬度投影到局部笛卡尔坐标系中。

如果想成为中心,那么就到中心去吧。 1211

Java编程常见内存溢出异常与代码示例

Java编程常见内存溢出异常与代码示例

Android framework 383

使用蒙特卡洛模拟方法在MATLAB中估算居里温度: 一个详细而通俗的指南

居里温度是磁性材料失去磁性的温度。但是,计算机模拟为我们提供了一个在理论和实验之间的桥梁,使我们能够在不进行实际测量的情况下估计这一重要参数。在下一部分,我们将详细介绍蒙特卡洛迭代的核心代码,以及如何使用它来模拟磁性材料中原子的行为。在估算居里温度的上下文中,我们将使用蒙特卡洛方法来模拟磁性材料中的原子或分子的行为。通过使用蒙特卡洛方法,我们可以在MATLAB中估算居里温度,从而为理论研究和实验设计提供有价值的信息。:我们使用的是一个有限的尺寸的网格模型,这可能导致一些大小效应,特别是在接近居里温度时。

qq_38334677的博客 977

如何制造出JAVA内存溢出_编写Java代码制造一个内存溢出的情况

这将会是一篇比较邪恶的文章,当你想在某个人的生活中制造悲剧时你可能会去google搜索它。在Java的世界里,内存溢出仅仅只是你在这种情况下可能会引入的一种bug。你的受害者会在办公室里度过几天甚至是几周的不眠之夜。在这篇文章中我将会介绍两种溢出方式,它们都是比较容易理解和重现的。并且它们都是来源现实项目的案例研究,但是为了让你清晰地掌握,我把它们简化了。不过放心,在我们遇到和解决了很过溢出bug...

weixin_39542936的博客 360

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

代码 内存 java_编写Java代码制造一个内存溢出的情况

这将会是一篇比较邪恶的文章,当你想在某个人的生活中制造悲剧时你可能会去google搜索它。在Java的世界里,内存溢出仅仅只是你在这种情况下可能会引入的一种bug。你的受害者会在办公室里度过几天甚至是几周的不眠之夜。在这篇文章中我将会介绍两种溢出方式,它们都是比较容易理解和重现的。并且它们都是来源现实项目的案例研究,但是为了让你清晰地掌握,我把它们简化了。不过放心,在我们遇到和解决了很过溢出bug...

weixin_34723479的博客 283

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java oom调试,编写Java代码制造一个内存溢出的情况

这将会是一篇比较邪恶的文章,当你想在某个人的生活中制造悲剧时你可能会去google搜索它。在Java的世界里,内存溢出仅仅只是你在这种情况下可能会引入的一种bug。你的受害者会在办公室里度过几天甚至是几周的不眠之夜。在这篇文章中我将会介绍两种溢出方式,它们都是比较容易理解和重现的。并且它们都是来源现实项目的案例研究,但是为了让你清晰地掌握,我把它们简化了。不过放心,在我们遇到和解决了很过溢出bug...

weixin_39828859的博客 211

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

常见的Java内存溢出情况和实例

文章目录内存溢出的原因栈溢出栈溢出的第1种情况,死递归,抛出StackOverflowError栈溢出的第2种情况,线程太多,抛出OutOfMemoryError堆溢出1.初始对象太大,超过机器内存,抛出OutOfMemoryError: Java heap space2.在方法执行中,回收效率不足2%,抛出OutOfMemoryError: GC overhead limit exceeded直接内存溢出 Direct buffer memory方法区溢出java.lang.OutOfMemoryErro

baidu_21349635的专栏 4147

java list 内存溢出_java内存溢出的2种情况

java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少。进过自己一番总结内存溢出主要分为2种:一、堆内存溢出 OutOfMemoryError从jvm的角度看发生的情况是:1、动态扩展的栈内存无法满足内存分配。2、建立新的线程没有足够内存创建栈。从编码角度看发生的情况是:1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;2、集合类中有对对象的引用...

weixin_32160507的博客 3620

java怎么写内存溢出的实例_Java内存溢出的几种情况代码实例解析

本篇文章小编给大家分享一下Java内存溢出的几种情况代码实例解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。JVM(Java虚拟机)是一个抽象的计算模型。就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。目的是为构建在其上运行的应用程序提供一个运行环境。JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理...

weixin_39689870的博客 443

JVM各种情况内存溢出分析

目录 1 直接内存溢出 2 内存溢出 2.1 堆溢出 2.2.1 堆溢出案例 2.3 永久代或元空间溢出 2.3.1 永久代或元空间溢出案例 2.4 栈溢出 2.4.1 栈溢出案例 2.5 非常规溢出 1 直接内存溢出 直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是 JVM 规范中定义的内存区域。但这部分内存也被频繁的使用,而且也可能导致 OutOfMemoryError 异常出现。...

赵广陆 6511

Java 内存溢出(java.lang.OutOfMemoryError)常见情况和总结

在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap space(堆区域)、Java Stacks(Java栈)。其中永久保存区域主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGen space区域...

vincent 1万+

Java内存溢出

<br />内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题。内存溢出与锁表则不然,一般现象是操作一般时间后系统越来越慢,直到死机,但并不能明确是在什么操作上出现的,发生的时间点也没有规律,查看日志或查看数据库也不能定位出问题的代码。<br />更严重的是内存溢出与数据库锁表在系统开发和单元测试阶段并不容易被发现,当系统正式上线一般时间后,操作的并发量上来了,数据也积累了一些,系统就

MRmaomaochong的专栏 1万+

java内存溢出的2种情况

转自:微点阅读(www.weidianyuedu.com)微点阅读 - 范文大全 - 免费学习网站 java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少。 进过自己一番总结内存溢出主要分为2种: 一、堆内存溢出 OutOfMemoryError 从jvm的角度看发生的情况是: 1、动态扩展的栈内存无法满足内存分配。 2、建立新的线程没有足够内存创建栈。 从编码角度看发生的情况是: 1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据; ...

asd3331380的博客 289

内存溢出的情况分析

简介 内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免。 溢出原因 内存溢出就是内存不够,引起内存溢出的原因有很多种,常见的有以下几种: 1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2

sinJack的博客 3万+

Jvm内存溢出的几种情况

关于Jvm内存溢出的几种情况

nocol的博客 7965

Java内存溢出的几种情况

JVM(Java虚拟机)是一个抽象的计算模型。就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。目的是为构建在其上运行的应用程序提供一个运行环境。JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理资源的硬件体系结构。 文章目录1. 前言2. 栈内存溢出3. 堆内存溢出 1. 前言 JVM提供的内存管理机制和自动垃圾回收极大的解放了用户对于内存的管理,大部分情况下不会出现内存泄漏和内存溢出问题。但是基本不会出现并不等于不会出现,所以掌握Java内存模型原..

Forlogenの解忧杂货铺 1098
上一篇: 带你简单认识淘宝API及相关的业务场景介绍
下一篇: Java面向对象的三大特征
普通网友
博客等级 码龄4年 200粉丝 100原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值