`
yuyiming1986
  • 浏览: 62236 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java内存管理

阅读更多
Java内存管理

一.Java内存中的堆和栈

   1.使用new关键字创建的对象,数组,内存空间都在堆(heap)上分配,而释放则是由Java中的垃圾回收机制决定和执行,GC为了能够正确的释放对象内存空间,需要监控每一个对象的运行状态,包括对象的申请,引用,被引用,赋值。

   2.在代码块或者函数中的局部变量(基于类型变量和对象引用变量)的内存空间则都在栈上分配,当前的代码块或者函数执行完成,超过了变量的作用域后,当中的局部变量也会被自动从栈中释放掉.


二.Java内存泄露
  
   满足以下两个条件的对象就可以确定引发Java中的内存泄漏,因为这些对象不会被GC所回收,然而它却占用内存资源:
   (1).对象是可达的,即在有向图中,对象是有路径可达的(存在着对此内存对象的引用).
   (2).这些对象是无用的,程序不在使用这个对象.
  
   经常用的一个做法是在对象使用完成时给对象引用赋值null,尽早让GC发现此对象无引用,可以回收,比如说:
   StringBuffer str = new StringBuffer("king");
   System.out.println(str);
   str = null;//将str引用变量置为null,以使用str对象符合垃圾回收的条件.
  
  
三.Java数据类型存储

   1.栈有一个重要的特性,就是存在栈中的数据是可以共享的,比如说,同时定义:
       int a = 2;
       int b = 2;

     编译器先处理int a = 2;首先会创建在栈中创建一个变量a的引用,然后查找有没有字面值为2地址,没有找着,就开辟一个存放3这个字面值的地址,然后将a指向2的地址。接着处理b = 2,发现栈中已经有3这个字面值,便直接将b指向3的地址。
  
     对于String类型也是比较常见的共享字符串常量的实例:
     String name1 = "king";
     String name2 = "king";
     两者name1, name2均指向同一个字符串内存地址,可以使用==比较,发现两者相等.
  
  
   2.对象的实例化可以分为两步:
  
     (1).首先在堆上分配对象所需要的内存空间,对其中的成员变量进行默认的初始化(
如果在定义类时有对成员变量进行显式的初始化,此时就会执行显式初始化);

     (2).调用构造函数进行初始化;


   3.基本类型对应的包装类都是在堆上分配内存比如说int-Integer, double-Double
     int a = 3;//在栈上
     Integer aObj = new Integer(3);//在堆上分配


   4.String str = "abc" 和String str = new String("abc")的区别
  
     String str = new String("abc")这个与其它普通对象的创建过程是一样的,都是在栈上创建一个引用变量str然后在堆上分配内存空间给对象,最后将引用栈中变量str指向堆上分配的对象内存空间。

     String str = "abc"则大不相同,它会在栈上分配一个引用变量str,然后在栈中查找是否有字面值"abc",如果有则直接将str指向此字面值"abc"的地址;如果没有则在栈上分配内存用于存储"abc"字面值,然后将str指向此地址。因为正如前面所说栈上数据是可以共享的,如果定义了两个字符串变量均指向"abc",那么就可以共享,并指向栈中同一份字符串"abc".如果使用String str = new String("abc"),就会在堆上分配两份内存空间来存储相当的一份数据,并且是不变的,显然是浪费的。

四.垃圾回收机制(GC:Garbage Collection)
 
    垃圾回收机制是一种动态内存管理技术,它自动的释放不再被程序引用的对象内存空间,按照特定的垃圾回收算法来实现内存资源的自动回收功能,当一个对象不再被引用时,所占用的内存空间将被回收,以便用于生成新的对象。

    1.垃圾回收器什么时候运行?  
    一般在CPU空闲或者内存资源不足时自动进行垃圾回收,无法精确的控制或者预知垃圾回收的时机和顺序.
    System.gc()只是允许向JVM申请执行垃圾回收器,但是JVM并不保证会执行。
 
 
    2.什么样的对象符合垃圾回收条件?
    如果一个对象没有获得任何线程的访问引用,此对象就是应该被垃圾回收的对象。
 
 
分享到:
评论

相关推荐

    Java内存管理机制相关资料汇总

    资源名称:Java内存管理机制相关资料汇总资源目录:【】java内存回收机制及预防【】java内存管理机制【】java内存管理白皮书【】Java虚拟机内存管理_对象和引用_空指针【】深入理解java虚拟机jvm高级行与最佳实践...

    Java内存管理机制

    1、JAVA 内存管理总结 2、Java的内存管理实例 3、垃圾回收机制:

    java内存管理精彩概述

    java内存管理精彩概述 java内存管理精彩概述 java内存管理精彩概述

    java内存管理详细介绍.doc

    本文档主要讲述的是java内存管理详细介绍;对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象...

    java内存管理 .pptx

    java内存管理

    java内存管理总结

    java 内存管理 详细介绍了java内存管理各个方面的内容

    关于java内存管理的一些理解

    主要关于java虚拟机的运行时数据区域,参考了周志明的深入理解java虚拟机,还涉及到了native方法、垃圾回收机制等等。

    java内存管理白皮书-英文版

    One strength of the Java™ 2 Platform, Standard Edition (J2SE™) is that it performs automatic memory management, thereby shielding the developer from the complexity of explicit memory management.

    JAVA 内存管理总结

    JAVA 内存管理总结 1. java是如何管理内存的 2. 什么叫java的内存泄露 3. JVM的内存区域组成 4.Java中数据在内存中是如何存储的 5. Java的内存管理实例

    java内存管理以及GC

    内存管理简介 内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/平台容易发生错误。 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。 另一个...

    java内存管理详细介绍

    java内存管理详细介绍,增强自己对虚拟机和内存进一步认识!

    java内存管理深入讲解

    java内存管理深入讲解 基本是理解java程序内存的直接能用的资料了

    Java的内存管理机制分析

    Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它

    java内存管理 ppt

    java内存结构,垃圾收集,并发收集,虚拟机参数

    java内存管理与垃圾回收

    java内存管理与垃圾回收

    JAVA内存管理机制

    JAVA内存管理机制的思维导图

    JAVA内存管理模式研究.pdf

    JAVA内存管理模式研究

    java内存管理

    NULL 博文链接:https://zhengzhuangjie.iteye.com/blog/1924477

Global site tag (gtag.js) - Google Analytics