`

JAVA内存管理

 
阅读更多
Java内存主要分为stack, heap, data segment, and code segment.

stack(栈):存放非静态基本数据类型变量的名称和值,以及非静态对象的引用

若是非静态基本数据类型变量,则变量的名称和值一起被存入stack(栈)中,变量的名称指向变量的值,比如int a=1; 并且此时变量的值具有共享性,即如果有具有相同值另一个变量压入栈中比如int b=1;,则该变量指向那个相同的值,也就是说这个值"1"被共享了,内存空间节省了。如果变量b的值被改变了比如int b=2; 则b将会指向即将被压入栈的“2”.
存储非静态对象的引用(相当于指针)比如String s1="abc"; String s2=new String("abc"); int[] intArray1=new int[3]; File[] fileArray=new File[10]; String[][] s3=new String[2][2]; 等 s1, s2, intArray1, fileArray, s3将会被存入栈中。
heap(堆):存放new产生的对象,比如上面代码的new String(), File[0], File[1], ... int[0], int[1], ... String[0][0], String[0][1], String[1][0], ...等
data segment 里面又分为 静态域 和 常量池(constant pond or constant pool):
静态域 存放静态基本数据类型变量的名称和值,以及静态对象的引用比如static String port="5557"; 此时port将会被存入data segment中的静态域。
常量池用于静态或非静态对象所使用的值。比如String s1="abc"; String s2=new String("abc"); static String port="5557"中的"abc", "5557". 但是前一个"abc"直接被栈s1指向;后一个"abc"被heap中的对象new String()所指,然后该对象又被栈s2指向。就是说常量池中的数据也被共享(里面只有一个"abc"),如果再 String s3=new String("abc");则栈中存引用s3,heap中又用一块内存存入对象new String(),然后该new String()指向"abc";如果再String s4="abc";则栈中存引用s4,直接指向常量池的同一"abc",即"abc"一直被重复利用着。但我们从中可以清楚的看到在if语句中(s1==s4)为真,但是(s2==s3)为假,正是因为此时比较的是变量本身存储的值(即所指的东西被存储的地址)。而(s1.equal(s2), s1.equal(s3), s1.equal(s4), s2.equal(s4), ...)都为真,因为equal比较的是最终的常量值。
code segment 当然是存储所有的像String s1="abc"; String s2=new String("abc"); int[] intArray1=new int[3]; File[] fileArray=new File[10]; String[][] s3=new String[2][2]; 等这样的代码。
由于对象所占的内存容易改变,比如ArrayList对象中数组的长度是可以动态改变的,所以Java对heap采用动态存储,即首先在编译运行之前就分配一个最小的内存值作为JVM启动内存,并且同时指定一个最大heap内存,以及当实际内存超过当前分配heap内存比如80%时自动拓展分配的heap内存,反之当小于30%时自动缩减分配的heap内存。而上面的所有值都是用户可以自己设定的。对象的资源收回由GC Java垃圾自动回收机制(Garbage Collector)管理。由于GC Java垃圾自动回收机制只回收那些超出对象作用域范围或被置为null的对象。注意Java垃圾自动回收机制只管理被new构建出来的对象!!所以对刚被定义的比如String ss=null; 这个ss不会被撤销。由于GC在一个单独的线程中运行,其回收对象的时间是不确定的,被废弃的对象不一定马上被回收,所以这也是Java程序通常会比较占内存的一个原因。对于其他内存存储区域比如stack,data segment等都是静态管理,即变量超出作用域时其内存立即被收回然后可以让给其他新的变量。
分享到:
评论

相关推荐

    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