什么是GC

什么是内存垃圾?

JVM堆内存中,已经确认不再被使用的内存对象。

什么是垃圾回收 GC(garbage collection)

创建对象时,需要在对应的内存区域分配内存空间,如果该区域不足,就触发该区域的gc.

System.gc()----手动回收垃圾jdk提供了一个gc函数,调用这个函数,就完成对JVM虚拟机内存进行一次GC

手动gc,JDK提供了一个gc函数,调用这个函数,就完成对JVM虚拟机内存进行一次GC

自动gc,当JVM虚拟机启动候,后台会自动运行跟一个gc程序,负责内存的gc操作

这个后台的gc程序会定时做gc操作,

jdk自带的jvisualvm工具 ,安装 Visual GC插件

对象与指针的关系

同一个对象可以被多个指针同时指向

一个指针可以指向不同的对象,但是同一时刻只能指向一个对象

测试当对象有指针指向的时候,对象不会被垃圾回收期回收

当对象没有指针指向的时候,对象会被垃圾回收器回收(不会立即回收)

 

方法区(Method Area--->JDK1.8后改名为元空间Meta Space)

存储字节码文件

栈区Stack Area

不需要垃圾回收

栈区中的局部变量不能共享

堆区 Heap Area

新生代(回收最频繁的区域)

伊甸园区

老年区

幸存者1区

幸存者2区

程序运行中很多对象都是朝生夕死

小对象出生在伊甸园区, gc后,如果能存活下来会被转移到幸存者区,对象的年龄计数器会+1

当对象经历了16次回收依然能够存活,会进入老年代

重对象/大对象一出生就在老年代

        

                         引用数据类型 (称为指针)

Minor GC和Major GC/Full GC的区别

Minor GC 发生在新生代的GC,速度很快

Major GC/Full GC 发生在老年代的GC,通常Major GC发生的时候都伴随着Minor GC的发生,速度比较慢

在执行GC的时候,所有的线程都会暂停运行,有一句叫做“stop the world                                ”

 栈区中的栈帧也是一个对象(不需要垃圾回收)

元空间

里面是字节码

常量池

常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。

一个对象可以同时被多个指针指向 一个指针可以指向不同的对象, 但是同一时刻只能指向1个

指针是可以传递的

从栈中传递到堆区 例如: 领养宠物成功后, 将宠物对象的指针传递到宠物数组中进行存储 随机生成怪物对象后, 将怪物对象的指针传递到怪物数组中进行存储 从栈中传递到另一个栈中 例如: 宠物杀死怪物成功后, 调用宠物的killOk方法, 并把怪物的指针传递 到killOk方法中, 这样可以在killOk方法中通过怪物的指针获取到被杀死的怪物对象中的信息

禁止直接操作对象中的属性, 用成员方法封装操作对象属性的过程 对象中的属性被private封装了 所有操作都应该提供成员方法, 用指针去调用成员方法来操作 例如: 当宠物攻击或被攻击, 怪物攻击或被攻击, 都应该提供对应的成员方法进行调用

指针不指向对象的时候,就会被栈区销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值