堆污染

简介: 堆污染是由于泛型的使用造成的一种潜在危险。总结起来,堆污染就是因为使用泛型参数化类内部成员变量,同一类的不同实例对象内部里面成员变量的类型可能不同,编译阶段无法发现,运行期间才能被发现的类型转换错误问题。以下面一图说明泛型可能带来的堆污染问题:

堆污染是由于泛型的使用造成的一种潜在危险。

总结起来,堆污染就是因为使用泛型参数化类内部成员变量,同一类的不同实例对象内部里面成员变量的类型可能不同,

编译阶段无法发现,运行期间才能被发现的类型转换错误问题。

以下面一图说明泛型可能带来的堆污染问题:

20191126120248345.png

虚拟机栈将方法(method)压栈,局部变量表中的list1会在堆空间中通过new关键字开辟内存空间,

并将该片内存空间的地址引用返回给list1。

但是List是个类类型,其中具体存放元素的Object数组只是这个类的成员变量。但是JAVA的引用传递的检查机制是在类层面的。


也就是说用相同形状的映射相同形状的,形状里面的内容无关紧要。


所以编译阶段是不会出错的,因为Object类型的数组可以存放任何元素,但是在通过引用指向取出元素的时候就会报类型转换错误——integer无法转换成String。


因为ArrayList的底层源码里面在指定泛型的时候已经将返回值类型替换掉。list1、list2的相同方法返回值类型一个为integer一个为String。

20191126142234928.png

目录
相关文章
|
5月前
|
存储 监控 算法
垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程
垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程
|
3月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
|
4月前
|
存储 Java 编译器
技术经验解读:【堆栈溢出】堆栈溢出
技术经验解读:【堆栈溢出】堆栈溢出
|
存储 编译器 C++
【C/C++】 静态内存分配与动态内存分配
C/C++ 中静态内存分配与动态内存分配相关内容,区别与比较
295 0
|
5月前
|
存储 编译器 C++
C++中栈与堆数据存取情况
C++中栈与堆数据存取情况
33 0
|
存储 Java
JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系
JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系
118 0
|
算法 Java 微服务
JVM垃圾回收器:分代堆内存管理,堆设计+分代边界+回收设计思路
垃圾回收器是JVM中最重要的组件之一,几乎每一个JDK的大版本都对垃圾回收进行重大的更新。另外,由于JDK发布策略的改变,在最近3年的版本发布中,每一个大版本都至少合入一个(甚至数个)关于垃圾回收的JEP。
|
算法
【基础篇】8 # 递归:如何避免出现堆栈溢出呢?
【基础篇】8 # 递归:如何避免出现堆栈溢出呢?
281 0
|
存储 IDE 编译器
函数内部分配的buffer过大导致堆栈溢出
函数内部分配的buffer过大导致堆栈溢出
439 0
函数内部分配的buffer过大导致堆栈溢出
|
算法 Java 调度
【可达性分析、强软弱虚引用、gc的过程中对象是否能回收、三色标记、跨代引用】
【可达性分析、强软弱虚引用、gc的过程中对象是否能回收、三色标记、跨代引用】
124 0