JAVA内存管理
来源:互联网 发布:共享单车车辆调度算法 编辑:程序博客网 时间:2024/05/21 09:21
你真的了解java里的string么
中文与unicode的转换
java内存管理特点
每一个java初学者都应该搞懂的问题
1. string str1 = "abc";
system.out.println(str1 == "abc");
转载地址:http://meng-lin.javaeye.com/
步骤:
1) 棧中开辟一块空间存放引用str1,
2) string池中开辟一块空间,存放string常量"abc",
3) 引用str1指向池中string常量"abc",
4) str1所指代的地址即常量"abc"所在地址,输出为true
2. string str2 = new string("abc");
system.out.println(str2 == "abc");
步骤:
1) 棧中开辟一块空间存放引用str2,
2) 堆中开辟一块空间存放一个新建的string对象"abc",
3) 引用str2指向堆中的新建的string对象"abc",
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false
3. string str3 = new string("abc");
system.out.println(str3 == str2);
步骤:
1) 棧中开辟一块空间存放引用str3,
2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的string对象,
3) 引用str3指向另外新建的那个string对象
4) str3和str2指向堆中不同的string对象,地址也不相同,输出为false
4. string str4 = "a" + "b";
system.out.println(str4 == "ab");
步骤:
1) 棧中开辟一块空间存放引用str4,
2) 根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的string常量"ab",
3) 引用str4指向池中常量"ab",
4) str4所指即池中常量"ab",输出为true
5. final string s = "a";
string str5 = s + "b";
system.out.println(str5 == "ab");
步骤:
同4
6. string s1 = "a";
string s2 = "b";
string str6 = s1 + s2;
system.out.println(str6 == "ab");
步骤:
1) 棧中开辟一块中间存放引用s1,s1指向池中string常量"a",
2) 棧中开辟一块中间存放引用s2,s2指向池中string常量"b",
3) 棧中开辟一块中间存放引用str5,
4) s1 + s2通过stringbuilder的最后一步tostring()方法还原一个新的string对象"ab",因此堆中开辟一块空间存放此对象,
5) 引用str6指向堆中(s1 + s2)所还原的新string对象,
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false
7. string str7 = "abc".substring(0, 2);
步骤:
1) 棧中开辟一块空间存放引用str7,
2) substring()方法还原一个新的string对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象,
3) 引用str7指向堆中的新string对象,
8. string str8 = "abc".touppercase();
步骤:
1) 棧中开辟一块空间存放引用str6,
2) touppercase()方法还原一个新的string对象"abc",池中并未开辟新的空间存放string常量"abc",
3) 引用str8指向堆中的新string对象
中文与unicode的转换
java代码
package hust.swt;
public class test
{
public static void main(string[] args)
{
string s = "ab简介";
string tt = gbencoding(s);
system.out.println(decodeunicode(tt));
}
public static string gbencoding(final string gbstring)
{
char[] utfbytes = gbstring.tochararray();
for (int i = 0; i-1)
{
end = datastr.indexof("\\u", start + 2);
string charstr = "";
if (end == -1)
{
charstr = datastr.substring(start + 2, datastr.length());
}
else
{
charstr = datastr.substring(start + 2, end);
}
char letter = (char) integer.parseint(charstr, 16); // 16进制parse整形字符串。
buffer.append(new character(letter).tostring());
start = end;
}
return buffer.tostring();
}
}
java内存管理特点
★java内存管理特点
java一个最大的优点就是取消了指针,由垃圾收集器来自动管理内存的回收。程序员不需要通过调用函数来释放内存。
1、java的内存管理就是对象的分配和释放问题。
在java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (heap)中分配空间。
对象的释放是由gc决定和执行的。
在java中,内存的分配是由程序完成的,而内存的释放是有gc完成的,这种收支两条线的方法简化了程序员的工作。但也加重了jvm的工作。这也是java程序运行速度较慢的原因之一。
gc释放空间方法:
监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。当该对象不再被引用时,释放对象。
2、内存管理结构
java使用有向图的方式进行内存管理,对于程序的每一个时刻,我们都有一个有向图表示jvm的内存分配情况。
将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,gc将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被gc回收。
3、使用有向图方式管理内存的优缺点
java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么gc也是可以回收它们的。
这种方式的优点是管理内存的精度很高,但是效率较低。
++:
另外一种常用的内存管理技术是使用计数器,例如com模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。
★java的内存泄露
java虽然由gc来回收内存,但也是存在泄露问题的,只是比c++小一点。
1、与c++的比较
c++所有对象的分配和回收都需要由用户来管理。即需要管理点,也需要管理边。若存在不可达的点,无法在回收分配给那个点的内存,导致内存泄露。存在无用的对象引用,自然也会导致内存泄露。
java由gc来管理内存回收,gc将回收不可达的对象占用的内存空间。所以,java需要考虑的内存泄露问题主要是那些被引用但无用的对象——即指要管理边就可以。被引用但无用的对象,程序引用了该对象,但后续不会再使用它。它占用的内存空间就浪费了。
如果存在对象的引用,这个对象就被定义为“活动的”,同时不会被释放。
2、java内存泄露处理
处理java的内存泄露问题:确认该对象不再会被使用。
典型的做法——
把对象数据成员设为null
从集合中移除该对象
注意,当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。
例子:
list mylist=new arraylist();
for (int i=1;i,<是同一类东东。由于它是由字母组成的,所以也是java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
string s = "i am an object!";
boolean isobject = s instanceof object;
我们声明了一个string对象引用,指向一个string对象,然后用instancof来测试它所指向的对象是否是object类的一个实例,显然,这是真的,所以返回true,也就是isobject的值为true。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:
public class bill
public class phonebill extends bill
public class gasbill extends bill
在处理程序里有一个方法,接受一个bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的bill对象可能是两种中的任何一种,所以要用instanceof来判断:
public double calculate(bill bill) {
if (bill instanceof phonebill)
if (bill instanceof gasbill)
...
}
这样就可以用一个方法处理两种子类。
然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:
public double calculate(phonebill bill)
public double calculate(gasbill bill)
所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。
本文来自csdn博客,转载请标明出处:http://blog.csdn.net/haobo920/archive/2010/08/03/5784990.aspx
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- 【Java】Java内存管理
- java内存管理-堆栈内存
- java内存管理-内存回收
- JAVA内存管理
- java内存管理
- JAVA 内存管理
- JAVA 内存管理
- java得内存管理
- Java内存管理思想
- Java内存管理思想
- Java内存管理思想
- java内存管理
- Java内存管理
- Java内存管理概述
- Java内存管理
- Java内存管理
- Java内存管理
- Java内存管理
- Java读取股票信息
- Java从控制台中读取数据的各种方法
- Rollen Holt
- java byte与char互转原理
- 通过Java SE 7自带的监控服务(WatchService API)实现类似.NET FileWatcher的功能
- JAVA内存管理
- java DatabaseMetaData
- Rain Man
- jsp与javascript
- Flex和java开发的参考书
- 青岛Java俱乐部火爆报名中
- 怎样学习java,漫谈java学习之路(转~~~~)
- 你未必知道 7个能改变世界的Java项目
- 不可多得的Javascript(AJAX)开发工具 - Aptana