码迷,mamicode.com
首页 > 编程语言 > 详细

Java 内存管理

时间:2017-05-30 21:51:39      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:类型   image   技术分享   垃圾   实例   方法   com   需要   部分   

1.内存管理

1)对象内存管理

  • 编译好的Java程序需要运行在JVM中
  • 程序,无论代码还是数据都需要存储在内存中,JVM为Java程序提供并管理所需要的内存空间
  • JVM内存分为“栈”、“堆”和“方法区”三个区域,分别用于存储不同数据

技术分享

 

2)堆

  JVM在其内存空间开启一个成为“堆”的存储空间,这部分空间用于存储使用new关键字所创建的对象。

  • 存储所有new出来的对象(包括成员变量)

3)成员变量的生命周期

  访问对象需要依靠引用变量,当一个对象没有任何引用时,被视为废弃的对象,属于被回收的范围,该对象中的所有成员变量也随之被回收。

  • 成员变量的声明周期为:从对象在堆中创建开始到对象从堆中被回收结束。

 技术分享

4)垃圾回收机制

  • 垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象
  • 不用担心内存管理,垃圾回收器(GC)不定时去堆中回收垃圾
  • GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象就立即回收
  • 一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法
  • System.gc()用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统

5)内存泄漏

  内存泄漏是指,不再使用的内存没有被及时的回收。严重的内存泄漏会因过多的内存占用而导致程序的崩溃。GC线程判断对象是否可以回收的依据是该对象是否有引用指向,因此,当确定该对象不再使用时,应该及时将其引用设置为null。

6)栈

  JVM在其内存空间开辟的一个称为“栈”的存储空间,栈用于存储程序运行时在方法中声明的所有局部变量(包括参数)。

技术分享

 

技术分享

 

7)局部变量声明周期

  一个运行的Java程序从开始到结束会有多次方法的调用,JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间成为该方法的栈帧。一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。当某一个方法调用完成后,其对应的栈帧将被清除,局部变量失效。

8)成员变量与局部变量比较

  • 成员变量:

  ——定义再类中,方法外

  ——有默认初始值,可以不显式初始化

  ——所在类被实例化后,存在堆中,对象被回收时,成员变量失效

  • 局部变量:

  ——定义在方法中

  ——没有默认值,必须自行设定初始值

  ——方法被调用时,存在栈中,方法调用结束,则栈帧被清除,局部变量一并失效

9)方法区

  方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。

  当类的信息被加载到方法区时,除了类的类型信息以外,同时类内的方法定义也被加载到方法区。

  类再实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中的一份方法定义的。

  • 存储.class字节码文件(包括方法)
  • 方法只有一份,通过this来区分具体的调用对象

技术分享

 

Java 内存管理

标签:类型   image   技术分享   垃圾   实例   方法   com   需要   部分   

原文地址:http://www.cnblogs.com/jmwm/p/6921366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!