Java GC理解

 

无用的内存对象无法被虚拟机回收
什么是内存泄漏:
  1)内存不在GC回收的掌控之内了。
     那么有几个问题:GC、内存;
(1)什么是垃圾回收机制-----GC?
       1.吃完了自己去把垃圾倒掉  ----------C语言---手动回收内存。
2.吃完直接走人,服务员回收餐具。吃饭的方式比较爽。-----GC
服务员怎么知道他要哪个餐具回收呢?
(投诉)回收的标准低--只要有客户不走--持有了餐具就不回收
GC会找一个合适的时机,一次性回收很多。
-------开发人员的素质。
总结:某个对象不再有任何的引用的时候才会进行垃圾回收
提问:如果某个对象被别的对象引用了,就不能被GC回收吗?
   否。(1)有软引用、弱引用、虚引用;
   (2)最终:该对象一直往上追溯引用,能追溯到GC Root引用,能追溯到GC Root对象是谁
-------------GC回收机制原理是?-------------------------------------
内存有哪些?数据区:方法区、堆内存、栈内存
可以作为GC Root引用点的是?(JVM里有哪些内存不可以被回收的)
       JavaStack中的引用的对象
方法区中静态的引用指向的对象
方法区中常量引用指向的对象
Native方法中JNI引用的对象
Thread----活着的线程
(2)怎么判断是垃圾对象呢?

 

   这是一个主观的判断。1.GC可以检测到的:2.主观

 

强引用:直接的对象引用

 -- 软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被gc回收(gc--垃圾回收机制)

 -- 弱引用:当一个对象只用弱引用存在时,此对象会随时被gc回收。

 

Java 把内存分成两种,一种叫做栈内存,一种叫做堆内存
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一
段代码块中定义一个变量时,java 就在栈中为这个变量分配内存空间,当超过变量的作用域
后,java 会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作它用。
堆内存用于存放由new 创建的对象和数组。在堆中分配的内存,由java 虚拟机自动垃
圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,
这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了
数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组
或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。
引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。
而数组&对象本身在堆中分配,即使程序运行到使用new 产生数组和对象的语句所在地代
码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它
的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃
圾回收器释放掉。这个也是java 比较占内存的主要原因。但是在写程序的时候,可以人为
的控制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值