堆污染

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

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

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

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

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

20191126120248345.png

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

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

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


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


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


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

20191126142234928.png

目录
相关文章
|
10月前
|
存储 Java 编译器
【面试知识】Java内存分配之常量池、堆、栈
【面试知识】Java内存分配之常量池、堆、栈
|
5月前
|
存储 JavaScript 前端开发
什么是循环引用现象呢
【10月更文挑战第13天】什么是循环引用现象呢
65 0
|
9月前
|
存储 Java 编译器
技术经验解读:【堆栈溢出】堆栈溢出
技术经验解读:【堆栈溢出】堆栈溢出
|
10月前
|
监控 算法 安全
JVM工作原理与实战(二十三):堆的垃圾回收-引用计数法和可达性分析法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了判断堆上的对象是否可以回收的方法(引用计数法、可达性分析法)、查看垃圾回收日志等内容。
105 0
|
10月前
|
存储 缓存 监控
JVM工作原理与实战(二十四):堆的垃圾回收-对象引用
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了强引用、软引用、弱引用、虚引用、终结器引用等内容。
98 0
|
10月前
|
存储 Java C++
Java内存管理的内存区域分为哪几部分?
Java内存管理的内存区域分为哪几部分?
68 1
|
10月前
|
缓存 算法 JavaScript
提高Java程序性能!了解可达性分析算法、强软弱虚引用和三色标记GC的过程,避免不可达对象阻碍程序性能!
提高Java程序性能!了解可达性分析算法、强软弱虚引用和三色标记GC的过程,避免不可达对象阻碍程序性能!
204 0
|
SQL 缓存 移动开发
Java内存泄漏知识(软引用、弱引用等)
要学习内存泄漏,我们要知道一些基础知识,如Java引用分类:
|
算法
【基础篇】8 # 递归:如何避免出现堆栈溢出呢?
【基础篇】8 # 递归:如何避免出现堆栈溢出呢?
350 0
|
算法 Java 调度
【可达性分析、强软弱虚引用、gc的过程中对象是否能回收、三色标记、跨代引用】
【可达性分析、强软弱虚引用、gc的过程中对象是否能回收、三色标记、跨代引用】
151 0