java内存机制

前言:java 类 对象 实例 实例化
类:在面向对象思维中,类(class)包括数据又包括作用于数据的封装体(方法)
类的数据为成员变量,方法为类的行为和能力,
对象:(object)就是累的实例,对象是动态的,拥有生命周期,从创建、运行到
消亡,
实例(声明):就是 Date d;
实例化: 一个过程 d=new Date(); 创建出来的对象只包含成员变量,不包含成员
方法,因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但他们
共享类的方法,

java中的东西都保存在哪:一个完整的java程序会涉及到的内存区域
1、寄存器:jvm内部虚拟寄存器,存储速度非常快,程序不可控制
2、栈:保存局部变量的值,(基本数据类型的值,类的实例,堆区对象的引用)
类的实例 就是换没有被实例化 A是类 A a;就是a的实例 a=new A()
是类的实例化
3、堆:用来存动态产生的数据,(new 对象,) 常量池存在与堆中
4、代码段:用来从硬盘上读取源程序代码
5、数据段:用来存放static定义的静态变量
示意图:
硬盘—>内存(内存中包括(数据段—>代码段—->栈—–>堆))

内存的管理机制:java的内存就是对象的分配和释放问题:
分配:内存的分配是由程序完成的,程序员用new为每个对象申请内存空间(基本类型除外),所有
对象都在堆(Heap)中分配空间。
释放:对象的释放是由垃圾回收机制决定和执行的,省了程序员加重了jvm的工作,GC必须监控每一个
对象的运行状态,对象的申请、引用、被引用、赋值等,GC都需要监控,

java内存泄露:
内存泄露就是存在一些被分配的对象,不被Gc回收,也就是无用对象持续占用内存或者无用对象
的内存得不到即时释放,
1、长生命周期的对象持有短生命周期的对象的引用就很可能发生内存泄露
,尽管短生命周期对象已经不再需要,但因为长生命周期对象持有它的引用而导致布恩那个被回收
这就是java的内存泄露/。
2、静态集合类引起内存泄露:像HashMap vector等的使用容易引起内存泄露,这些静态变量的
生命周期和应用程序一直,他们所引用的所有对象object也不能被释放,因为他们一直被
vector等引用着,
3、监听器:java编程中监听器例如addxxListener等方法来增加监听器,在释放对象的时候却
没有记得删除这些监听器,从而增加内存泄露的机会。
4、各种链接:数据库链接,网络链接 IO 都需要显示的方法调用close才能将其关闭,否则
就不会被GC回收。

jvm的内存组成:
jvm把内存分为两种:1、栈内存。2、堆内存
1、函数中定义的基本类型变量和对象的引用变量都在函数的栈内
2、堆内存用来存放由new创建的对象和数组,以及对象的实例变量,在函数

    对象在创建声明时在栈内存中保存对象的声明,当对象实例化时new A()会在堆内存中为对象的
        实例申请内存

android 内存关系:内存泄露和内存溢出
内存泄露:垃圾回收器无法回收原本应该被回收的对象,这个对象就发生了内存泄露。
泄露的危害:过多的内存泄露会造成内存溢出(oom)
内存泄露导致可用内存不足,会触发,频繁的GC,
内存溢出:android为每个进程设置了Dalvik Heap Size阈值,阈值根据手机的RAM不同而不同,
如果APP分配内存超出这个阈值,就会发生OOM.
ActivityManager.getMemoryClass();获取当前APP的Heap size阈值

GC浅谈:
GC:在java的类对象存储的堆中,找到无用对象,并把这些对象占用的内存空间回收,使其可以
重新被利用。

java堆:就是java类对象的活动空间,程序给类对象分配内存空间,存储着正在运行着的应用程序
        对像的建立方式就是new ,后对象无用被GC回收,

jvm堆分为:
    新域:存储所有新生的对象
    旧域:新域中的对象,经过一定次序的GC后被移入旧域
    永久域:存储类和方法对象,从配置上说,这个域是独立的,不包括jvm堆内,

GC回收步骤:
1、当eden满了,就触发young GC
2、young GC 做了2件事:1去掉一部分无用的object 2、把老的还被引用的object发送到survior里面
等下几次GC 以后,survior再放到old里面
3、old满了,就会触发full GC ,它很消耗内存,把young old里面的大部分垃圾回收掉,

如何判断对象无用:jvm发展过程中有两种方法:引用计数和根基算法:
引用计数:对对象类的引用次数。
根基算法:jvm采用类似树结构来保存java类对象,从GCRoot开始遍历引用,引用可达(也就是可用
引用),遍历不到就是不可达,不可达对象就该被回收,

参考:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值