JAVA学习之内存分析

 

1.java是如何管理内存的:
java的内存管理就是对象的分配和释放问题。
分配:内存的分配是由程序员来完成的,通过new关键字为每个对象申请内存空间,在heap中分配空间来存储这些对象,在stack中分配空间存放对象的引用变量;
释放:对象的释放是由垃圾回收机制决定和执行的,这样做减轻了程序员的工作,同时也加重了JVM的工作。GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用 、赋值等等,GC都要进行监控。

2.java内存泄露:
内存泄露就是存在一些被分配的对象,这些对象是可用的,即内存中存在该对象的引用,其次,这些对象是无用的,以后程序员不会再使用这些对象,这些对象不会被GC所回收,但确站着内存,则称为内存溢出。

3.java数据类型在内存中的存储:
a)基本数据类型:这些值以及引用变量都存在于栈中,当程序块退出后,这些值自动消失;栈还有一个重要的特殊性:存在栈中的数据可以共享;
  int a=3;int b=3;int a=4;
  编译器先处理int a=3;首先在栈中创建一个变量为a的引用,然后查找有没有值为3的地址,没有就开辟一个存放3这个值的地址,然后将a指向3的地址;
  接着处理int b=3;创建b这个引用变量,由于栈中已经存在3这个值,便将b直接指向3的地址。这时a和b同时指向3的地址;
  再执行int a=4;会再次查询有没有值为4的地址,没有的话重新开辟地址存放4的值,将a指向这个地址。
b)对象:在堆中开辟内存存放对象的实例化,在栈中存放对象的引用,可以通过栈中对象的引用直接访问堆中的对象;

4.注意点:
 1)尽早释放无用对象的引用。好的办法就是使用临时变量的时候,让引用变量在退出活动区域后,自动设置为null,让垃圾回收器来回收,防止内存泄露;
 2)尽量少用静态变量,因为静态变量时全局的,GC不会回收;
 3)尽量少用finalize函数,因为finalize()会加大GC的工作量,而GC相当于耗费系统的计算能力;
练习:  String s1 = "a";
              String s2 = "b";
              String str6 = s1 + s2;
              System.out.println(str6 == "ab"); //false;
首先在栈中开辟一块空间存放引用s1,s1指向连接池中string常量"a";
然后在栈中开辟一块空间存放引用s2,s2指向连接池中string常量"b";
在栈中开辟一块空间存放引用str6;
在堆中开辟一个空间存放string对象"ab";
str6指向堆中的对象"ab";而常量"ab"在连接池中,所以false

5.堆和栈的优缺点:
堆:可以动态的分配内存的大小,但是存取的速度比较慢;
栈:存取速度比较快,数据可以共享,但是栈中存取数据的大小和生存期必须是确定的,缺乏灵活性;


java中的堆(heap)栈(stack)的详解:
java把内存大体上分为两种:一中是heap内存,一种是stack内存;在方法中定义的一些基本类型的变量和对象的引用变量都是在stack内存中分配;而在heap内存中存放由new创建的对象和数组。在heap中产生一个数组或者对象之后,在stack中定义一个特殊的变量,则这个stack中的变量取值等于heap中那个数组或者对象的首地址,stack中的这个变量就成为了数组或者变量的引用变量;之后就可以通过stack中的这个引用变量来访问heap中的数组或者变量的实例;引用变量在程序运行到其作用域之外后被释放,而heap中的数组或者对象的实例不会被立即释放,继续占据内存空间,在随后的一个不确定的时间被垃圾回收器收走;
实际上,stack中的变量指向heap内存中的变量,就是java的指针;

当然细分内存则分为:1)栈(stack):由编译器自动分配释放,存放堆中对象的引用地址;
                    2)堆(heap): 由程序员分配,由垃圾回收器回收,存放属性;
                    3)全局区(静态区static):存储全局变量和静态变量;初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量存储在相邻的另一块域。
                    4)文字常量区:常量字符串就是放在这里的;
                    5)程序代码区:存放方法体的二进制代码;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值