public class GcTest { public void localvarGc1() { byte[] a = new byte[6*1024*1024]; System.gc(); } public void localvarGc2() { byte[] a = new byte[6*1024*1024]; a=null; System.gc(); } public void localvarGc3(){ { byte[] a = new byte[6*1024*1024]; } System.gc(); } public void localvarGc4() { { byte[] a = new byte[6*1024*1024]; } int c = 10; System.gc(); } public void localvarGc5() { localvarGc1(); System.gc(); } public static void main(String[] args) { GcTest ins = new GcTest(); ins.localvarGc1(); } }
在上述代码中,每一个localvarGcN()函数都分配了一块6MB的堆空间,并是用局部变量引用这块空间。
在localvarGc1()中,在申请空间后,立即进行垃圾回收,很明显,由于byte数组被变量a引用,因此无法回收这块空间。
在localvarGc2()中,在垃圾回收前,先将变量a置为null,使byte数组失去强引用,姑垃圾回收可以顺利回收byte数组。
对于localvarGc3(),在进行垃圾回收前,先使局部变量a失效,虽然变量a已经离开了作用域,但是变量a依然存在于局部变量表中,并且也指向这块byte数组,故byte数组依然无法被回收。
对于localvarGc4(),在垃圾回收之前,不仅使变量a失效,更是申明了变量c,使变量c复用了变量a之前的栈,由于变量a此时被销毁,姑垃圾回收器可以顺利回收byte数组。
对于localvarGc5(),它首先调用了localvarGc1(),很明显,在localvarGc1()中并没有释放byte数组,但在localvarGc1()返回后,它的栈帧被销毁,自然也包含了栈帧中的所有局部变量,故byte数组失去引用,在localvarGc5()的垃圾回收中被回收。
在启动jvm虚拟机的时候可以使用参数-XX:+PrintGC执行上述几个函数,在输出的日志中,可以看到垃圾回收前后堆的大小,进而推断byte数组是否被回收。下面的输出是函数localvarGc4()的运行结果:
从日志中可以看到,堆空间从回收前的6809k变为回收后的600k,释放了约6MB空间。进而可以推断,byte数组已被回收释放。
下面是函数localvarGc1()的运行结果:
可以看出堆空间几乎没有变化。
相关推荐
垃圾回收 对象是使用new创建的, 但是并没有与之相对应的delete操作来回收对象占用的内存. 当我们完成对某个 对象的使用时, 只需停止该对象的引用: ->将引用改变为指向其他对象 ->将引用指向null ->从方法中返回, ...
一、垃圾回收机制—GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。 原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放...
VM相关的一些内容,比如...垃圾回收机制: java 语言的优势之一就是它的自动内存管理,主要回收运行时数据区域的堆内存里的数据 类加载机制: 虚拟机首先需要把编译完成的字节码文件通过类加载器来加载到运行时数据区域
不再被引用的对象(局部变量,没有指针指向的) java的安全性: 沙箱机制:只能做沙箱允许的操作 通过下面环节,实现安全 加载有用的类文件,不需要的不加载 校验字节码,查看允许的操作 查看代码和...
特别是String对象的使用中,出现字符串连接情况时应使用StringBuffer代替,由于系统不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响...
一小块区域 成员变量:方法外部,类内部定义的变量 局部变量:类的方法中的变量。 成员变量和局部 变量的区别 作用域 成员变量:针对整个类有效。 局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)
(3)局部变量是线程安全的,如果方法内部的局部变量,没有逃离方法的作用范围 (4)栈内存溢出:栈帧过多,栈帧过大 3.本地方法栈:当Java去调用一些本地的C/C++方法时使用的栈,native关键字修饰的方法是间接去调用...
323: Local-Variable Syntax for Lambda Parameters(用于 Lambda 参数的局部变量语法) 324: Key Agreement with Curve25519 and Curve448(采用 Curve25519 和 Curve448 算法实现的密钥协议) 327: Unicode 10 328...
定义 通俗的来讲,jvm主要...栈: 线程私有存储空间,访问速度仅次于寄存器,栈里面的存储单位为,栈帧, 栈帧对应着方法, 存放着方法的 局部变量表,操作数栈,常量池引用,方法返回地址。 本地方法栈:用于管理本
2.堆(操作系统): 一般由程序员分配释放,例如在c/c++中,在golang,java,python有自动的垃圾回收机制 我们都知道变量占有内存,内存在底层分配上有堆和栈。 值类型变量的内存通常是在栈中分配 引用类型变量的...
最新jvm面试题合集,涵盖JVM运行时数据区、垃圾回收算法、垃圾回收器、类加载机制、JIT即时编译等核心知识点及常见面试题,一书在手,天下我有。 JVM内存结构:JVM的内存结构主要包括堆内存、方法区、栈(包括Java...
(4)垃圾回收机制 --- 自动垃圾收集,永远不会出现内存泄露的问题 4、虚拟机 java语言是先编译后解释,java源码是通过编译生成一种特殊的.class的中间字节码文件,然后再由JVM进行解释运行。 (编译) (解释...
JAVA最佳性能优 化JAVA优化技巧 类的方法内联,方法的同步及局部变量的使用 创建类的实例优化策略 建立对象池提升性能策略 JAVA垃圾回收机制及引用优化策略
堆⾥的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。 2.举个栗⼦ 2.1堆和栈的定义 以主函数⾥的语句 int [] arr=new int [3] 在内存中的定义为例: 主函数先进栈,在栈中定义⼀个变量arr...
学生提问:Java为什么要对这些数据进行缓存呢? 67 3.7.6 逻辑运算符 67 3.7.7 三目运算符 68 3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 ...
1:局部内部类还可以访问成员变量 2:静态内部类可以访问外部类的所有成员和方法 3:成员内部类可以访问外部类的所有属性和方法 OutputStream抽象类中的方法 abstract void write(int n) 写出一个字节的数据 ...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
JDK 11引入了“var”关键字,允许根据初始化值的类型自动推断局部变量的类型,还新增了单引号字符串支持,并增强了安全性,例如默认禁用弱加密算法,更新TLS版本以保护应用程序免受安全威胁 模块化。JDK 11引入了...
- 原始类型、二元运算符、局部变量、默认值、增量和减量、 ; - 、 ; ; ; ; Java 概念。 Java虚拟机——什么是解释型语言,什么是jre、jdk、不同版本的java; 内存管理——手动内存管理、自动(共享指针)和垃圾...