JAVA程序执行内存分析.ppt

上传人:ni****g 文档编号:570827790 上传时间:2024-08-06 格式:PPT 页数:66 大小:497.50KB
返回 下载 相关 举报
JAVA程序执行内存分析.ppt_第1页
第1页 / 共66页
JAVA程序执行内存分析.ppt_第2页
第2页 / 共66页
JAVA程序执行内存分析.ppt_第3页
第3页 / 共66页
JAVA程序执行内存分析.ppt_第4页
第4页 / 共66页
JAVA程序执行内存分析.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《JAVA程序执行内存分析.ppt》由会员分享,可在线阅读,更多相关《JAVA程序执行内存分析.ppt(66页珍藏版)》请在金锄头文库上搜索。

1、JAVA程序执行内存分析内存分析内存中的存放code segmentdata segmentstackheap存放代码存放代码静态变量,字符串变量静态变量,字符串变量局部变量局部变量new出来的东西出来的东西Birthdate类class BirthDateclass BirthDate private int day; private int day; private int month; private int month; private int year; private int year; public BirthDate(int d,int m,int y) public Birt

2、hDate(int d,int m,int y) day=d;month=m;year=y; day=d;month=m;year=y; public void setDay(int d)day=d; public void setDay(int d)day=d; public void setMonth(int m)month=m; public void setMonth(int m)month=m; public void setYear(int y)year=y; public void setYear(int y)year=y; public int getDay()return d

3、ay; public int getDay()return day; public int getMonth()return month; public int getMonth()return month; public int getYear()return year; public int getYear()return year; public void dispaly() public void dispaly()System.out.println(day+-+month+-+year);System.out.println(day+-+month+-+year); Test类类p

4、ublic class Testpublic class Test public static void main(String args) public static void main(String args) Test test=new Test(); Test test=new Test(); int date=9; int date=9; BirthDate d1=new BirthDate(7,7,1970); BirthDate d1=new BirthDate(7,7,1970); BirthDate d2=new BirthDate(1,1,2000); BirthDate

5、d2=new BirthDate(1,1,2000); test.change1(date); test.change1(date); test.change2(d1); test.change2(d1); test.chang3(d2); test.chang3(d2); System.out.println(date=+date); System.out.println(date=+date); d1.display(); d1.display(); d2.display(); d2.display(); public void chang1(int i)i=1234; public vo

6、id chang1(int i)i=1234; public void chang2(BirthDate b)b=new BirthDate(22,2,2004); public void chang2(BirthDate b)b=new BirthDate(22,2,2004); public void chang3(BirthDate b)b.setDay(22); public void chang3(BirthDate b)b.setDay(22); 内存中变量存放说明Test test=new Test();test为局部变量,指向new出来的对象test:xxxstackheap内

7、存中变量存放说明int date;定义局部变量,占一块内存stackdate:9内存中变量存放说明BirthDate d1=new BirthDate(7,7,1970);BirthDate d1=new BirthDate(7,7,1970);局部变量局部变量d1d1,指向,指向newnew出来的对象出来的对象stackd1:xxxy1970m7d7heapdaymonthyear构造方法调用结束后,构造方法调用结束后,d,m,y将被释放将被释放内存中变量存放说明test.change1(date);test.change1(date);调用调用TestTest中的中的change1chan

8、ge1方法方法stackdate:9ii:9i:1234传值传值赋值赋值调用结束,调用结束,i被释放被释放内存中变量存放说明 test.change2(d1); test.change2(d1);heapstackd1:xxxb:xxxday:7month:7year:1970传地址传地址new:xxxday:22month:2year:2004传地址传地址123456方法调用结束后方法调用结束后b和和new消失消失7内存中变量存放说明test.chang3(d2);test.chang3(d2);stackheapd2:xxxb:xxxday:1month:1year:2000d:22132

9、4传值传值传值传值方法调用结束后方法调用结束后b和和d消失消失5三维坐标中的点 class Point int x,y,z; Point(int a,int b,int c) x=a;y=b;z=c; void getDistance(Point p) return (x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z);Point p1=new Point(1,2,3);System.out.println(+getDistance(new Point(0,0,0);上例内存分析System.out.println(+getDistance(new P

10、oint(0,0,0);stackheapx:1y:2z:3x:0y:0z:0p1:xxxp:xxx132传地址传地址调用结束后调用结束后p被释放被释放this关键字的引用关键字的引用public class Leafpublic class Leaf int i=0; int i=0; Leaf(int i)this.i=i; Leaf(int i)this.i=i; Leaf increament() Leaf increament() i+;return this; i+;return this; void print()System.out.println(i=+i); void pr

11、int()System.out.println(i=+i); public static void main(String args) public static void main(String args) Leaf leaf=new Leaf(100); Leaf leaf=new Leaf(100); leaf.increament().increament().print(); leaf.increament().increament().print(); this关键字的引用关键字的引用Leaf leaf=new Leaf(100);Leaf leaf=new Leaf(100);s

12、tackheapthisi:100i:100调用结束后调用结束后i被释放被释放leaf:xxx想象想象this在类中在类中this关键字的引用关键字的引用leaf.increament().increament().print();leaf.increament().increament().print();leaf:xxxthisi:102leaf1:xxxleaf2:xxxthis是当前对象的是当前对象的引用引用stackheapthis关键字的引用关键字的引用leaf.increament().increament().print(leaf.increament().increament

13、().print(););相当于以下程序段:相当于以下程序段:leaf.increament();leaf.increament();leaf.increament();leaf.print();leaf.increament();leaf.print();leaf.increament().increament().print(leaf.increament().increament().print(););返回返回leaf对象的对象的引用引用l1,指向,指向leaf对象对象返回返回leaf对象的对象的引用引用l2,指向,指向leaf对象对象内存分析(一)class PointXY /cla

14、ss PointXY /分析程序在内存中执分析程序在内存中执行过程行过程private double x;private double x;private double y;private double y;PointXY(double x1,double PointXY(double x1,double y1)x=x1;y=y1;y1)x=x1;y=y1;public double getX()return x;public double getX()return x;public double getY()return y;public double getY()return y;publ

15、ic void setX(double i)x=i;public void setX(double i)x=i;public void setY(double i)y=i;public void setY(double i)y=i; 内存分析(二)class Circleclass Circleprivate PointXY o;private PointXY o;private double radius;private double radius;Circle(PointXY p,double r)o=p;radius=r;Circle(PointXY p,double r)o=p;rad

16、ius=r;Circle(double r)Circle(double r)o=new PointXY(0.0,0.0);radius=r;o=new PointXY(0.0,0.0);radius=r;boolean contains(PointXY p)boolean contains(PointXY p)double x=p.getX()-o.getX();double x=p.getX()-o.getX();double y=p.getY()-o.getY();double y=p.getY()-o.getY();if(x*x+y*yradius*radius) return fals

17、e;if(x*x+y*yradius*radius) return false;else return true;else return true;public void setO(double x,double y)public void setO(double x,double y)o.setX(x);o.setY(y);o.setX(x);o.setY(y);public PointXY getO()return o;public PointXY getO()return o;public double getRadius()return radius;public double get

18、Radius()return radius;public void setRadius(double r)radius=r;public void setRadius(double r)radius=r;public double area()return 3.14*radius*radius;public double area()return 3.14*radius*radius; 内存分析(三)public class TestCircle public class TestCircle public static void main(String args)public static

19、void main(String args)Circle c1=new Circle(new PointXY(1.0,2.0),2.0); Circle c1=new Circle(new PointXY(1.0,2.0),2.0); Circle c2=new Circle(5.0);Circle c2=new Circle(5.0);System.out.println(c1:(+c1.getO().getX()+,System.out.println(c1:(+c1.getO().getX()+,+c1.getO().getY()+),+c1.getRadius();+c1.getO()

20、.getY()+),+c1.getRadius();System.out.println(c2:(+c2.getO().getX()+,+c2.getO().getY()+),+c1.getSystem.out.println(c2:(+c2.getO().getX()+,+c2.getO().getY()+),+c1.getRadius();Radius();System.out.println(c1 area =+c1.area();System.out.println(c1 area =+c1.area();System.out.println(c2 area =+c2.area();S

21、ystem.out.println(c2 area =+c2.area();c1.setO(5, 6);c2.setRadius(9.0);c1.setO(5, 6);c2.setRadius(9.0);System.out.println(c1=(+c1.getO().getX()+,+c1.getO().getY()+),+c1.getSystem.out.println(c1=(+c1.getO().getX()+,+c1.getO().getY()+),+c1.getRadius();Radius();System.out.println(c2=(+c1.getO().getX()+,

22、+c2.getO().getY()+),+c2.getSystem.out.println(c2=(+c1.getO().getX()+,+c2.getO().getY()+),+c2.getRadius();Radius();System.out.println(c1 area =+c1.area();System.out.println(c2 area System.out.println(c1 area =+c1.area();System.out.println(c2 area =+c2.area();=+c2.area();PointXY p1=new PointXY(5.2,6.3

23、);PointXY p1=new PointXY(5.2,6.3);System.out.println(c1.contains(p1);System.out.println(c1.contains(p1);System.out.println(c1.contains(new PointXY(10.0,9.0);System.out.println(c1.contains(new PointXY(10.0,9.0); Circle c1=new Circle(new PointXY(1.0,2.0),2.0);c1:xxxx:1.0y:2.0x1:1.0y1:2.0oradius:2.0p:x

24、xxr:2.0紫色的调用结束后释放紫色的调用结束后释放红色的几位调用结束后内存布局红色的几位调用结束后内存布局stackheapCircle c2=new Circle(5.0);c2:xxxoradius:5.0r:5.0x1:0.0y1:0.0x:0.0y:o.ostackheapSystem.out.println(c1:(+c1.getO().getX()+,+c1.getO().getY()+),+c1.getRadius();c1:xxxoradius:2.0x:1.0y:2.0和和o里的值一样里的值一样1.0返回值返回值返回值返回值stackheap2.0返回值返回值c1.set

25、O(5, 6);c2.setRadius(9.0);oradius:2.0oradius:5.09.0x:1.05y:2.06x:0.0y:0.0c1:xxxc2:xxxx:5y:6i:5i:6r:9.0heapstackSystem.out.println(c1.contains(p1);oradius:2.0x:5y:6x:5.2y:6.3c1:xxxp1:xxxp:xxxxystackheaptruestatic关键字的使用public class Catpublic class Cat private static int sid=0; private static int sid=0

26、; private String name; private String name; int id; int id; Cat(String name) Cat(String name) this.name=name; this.name=name; id=sid+; id=sid+; public void info public void info System.out.println(My name is +name+ NO.+id); System.out.println(My name is +name+ NO.+id); public static void main(String

27、 args) public static void main(String args) Cat.sid=100; Cat.sid=100; Cat.mimi=new Cat(mimi); Cat.mimi=new Cat(mimi); Cat.pipi=new Cat(pipi); Cat.pipi=new Cat(pipi); mimi.info(); mimi.info(); pipi.info(); pipi.info(); static关键字的使用stackheapdata segsid:100101102id:100nameid:101namemimi:xxxpipi:xxxmimi

28、pipinamename类的继承类的继承studentPersonnameageschoolstackheap子类子类父类父类Java权限修饰符修饰符修饰符类内部类内部同一个包同一个包 子类子类任何地方任何地方privateyesdefaultyesyesprotectcdyesyesyespublicyesyesyesyessuper和this的使用cc:xxxvaleuvaluethissuper子类子类父类父类Testsupr.class Stu s1=new Stu(C,s1);persnamelocationschoolthissuperheapbeijingCs1s1namesch

29、oolnlschoolnamelocationdata segstackhashcodes tablehashcodes table对象对象对象对象对象对象对象对象对象对象每一个对象都有独一无二的每一个对象都有独一无二的hashcodes,通过它可以找到所在对象的位置通过它可以找到所在对象的位置对象转型对象转型casting(TestAnimals)class Animalclass Dg extends AnimalAnimal a=new Animal();/a=new Dg();/Dg d1=(Dg)a;/对象转型对象转型casting(TestAnimals)Animal aAnima

30、lnamefurcolor程序中把程序中把a当成一只普通的当成一只普通的Animal,不能访问,不能访问Dg中的成员中的成员Dg不能访问不能访问表明表明实质实质只能访问作为父类的那部分成员只能访问作为父类的那部分成员Dg d1动态绑定和多态(TestPolymoph)Cate cname:catnameeyeColor:bluename:l1Anima petlady l1实质上指向实质上指向code segAnima enjoyCate enjoyDo enjoy根据实际对象类型来调用根据实际对象类型来调用方法方法星际的多态应用父类父类GameObjectdraw()继承继承使用多态使用多态

31、异常的概念异常的概念public void someMethod() throws SomeException if(someCondition() throw new SomeException(错误原因); 声明该方法可能抛出的异常声明该方法可能抛出的异常构造并抛出异常对象构造并抛出异常对象抛出异常抛出异常try someMethod();catch(SomeException e) /异常处理代码;调用该方法时试图捕捉异常调用该方法时试图捕捉异常定义处理异常的代码定义处理异常的代码异常的分类ThrowableErrorExceptionRuntimeException可抛出的可抛出的系统

32、错误,处理不了系统错误,处理不了能处理的错误能处理的错误经常出的错误,可以不经常出的错误,可以不catch必须得必须得catch的异常的异常运行时异常运行时异常非运行时异常非运行时异常method() throws SomeException.包含包含异常类的父类异常类的父类异常的捕获和处理异常的捕获和处理trytry/可能抛出异常的语可能抛出异常的语 catch(SomeException e1)catch(SomeException e1).catch(SomeException e2)catch(SomeException e2).finally.finally.统一的出口,都要被执行,

33、可进行资源的清除工作统一的出口,都要被执行,可进行资源的清除工作readFile() throws IOException.method1() throws IOException readFile()method2() throws IOException method1()public static main(String s) try method2() catch(IOException e).抛异常抛异常抛异常抛异常抛异常抛异常捕获捕获处理处理main方法可不处理,向外抛方法可不处理,向外抛int s; int s; 数组定义数组定义s=new int5;s=new int5;xxx

34、sstackheap自动初始化都为自动初始化都为0Date days; Date days; 数组分配空间和赋值数组分配空间和赋值days=new Date3;days=new Date3;for(int i=0;i3;i+)for(int i=0;i3;i+)daysi=new Date(2004,4,i+1);daysi=new Date(2004,4,i+1);xxxxxxxxxxxx200441200442200443daysstackheap数组动态初始化数组动态初始化int a;/int a;/定义定义a=new int3;/a=new int3;/分配空间分配空间a0=1;a1=

35、2;a2=3;/a0=1;a1=2;a2=3;/赋值赋值Date days;/Date days;/定义定义days=new Date2;/days=new Date2;/分配空间分配空间days0=new Date(2004,4,1);/days0=new Date(2004,4,1);/赋值赋值days1=new Date(2004,4,2);/days1=new Date(2004,4,2);/赋值赋值数组定义与为数组元素分配空间和赋值分开进行数组定义与为数组元素分配空间和赋值分开进行数组元素静态初始化int a3=1,2,3;Date days= new Date(2004,4,1),

36、 new Date(2004,4,2), new Date(2004,4,3);在定义数组的同时就分配空间和赋值在定义数组的同时就分配空间和赋值数组元素的默认初始化数组元素的默认初始化数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化int a=new int3;System.out.println(a1);Date days=new Date3;System.out.prinyln(days2);数组作为返回值.Date dxxxx返回值返回值数组模拟链表数组模拟链表1234050154323450202345删除该元素删除该元素二维数

37、组xxxx a0a2a00a01a10a11a20 a21.heapstacka1xxxxxxxxxxxxa一维数组一维数组数组的数组数组的数组Java中多维数组的声明和初始化应按从高维到低维的顺序进行int a=new int3; /动态初始化a0=new int2;a1=new int4;a2=new int3;int a=new int35; /动态初始化int a=4,2,13,32,424,32,1,32,12;/静态初始化二维数组的访问:aij二维数组的输出int a=1,2,3,4,5,6,7,8,9;for(int i=0;ia.length;i+) for(int j=0;j

38、ai.length;j+) System.out.print (a+i+j+=+aij+,); System.out.println();该循环可用于二维数组的整体赋值和输出二维字符串数组数组元素数组元素一维一维字符串字符串二维二维String类不可变String s1=hello;String s2=world;s1+=s2;helloworldhelloworlds1s2新建的对象不可变不可变容器APICollection Set List Map HashSet LinkedList ArrayList HashMap无顺序,不可重复有顺序,可重复(equals)一个一个向里装一个一个向

39、里装一对一对向里装一对一对向里装Iterator容器容器 next 元素元素游标游标Array与与Linked比较比较去掉去掉ArrayLinked改时要建一个新的数组读时沿着链表向下查找InputStream流流PipedInputStreamFilterInputStreamByteArrayInputStreamSequenceInputStreamStringBufferInputStreamObjectInputStreamLineNumberInputStreamDataInputStreamBufferedInputStreamPushbackInputStreamFileInp

40、utStreamInputStream节点流节点流处理流处理流OutputStream类类FileOutputStreamPipedOutputStreamFilterOutputStreamByteArrayOutputStreamObjectOutputStreamDataOutputStreamBufferedOutputStreamPrintStreamOutputStream处理流处理流节点流节点流节点流类型节点流类型 类型类型 字符流字符流 字节流字节流File(文件)FileReader FileWriter FileInputStream FileOutputStreamMem

41、ory ArraayCharArrayReaderCharArrayWriterByteArrayInputStByteArrayOutputStMemory StringStringReaderStringWriter pipe(管道)pipedReaderPipedWriterPipedInputStreamPipedOutputStream处理类型字符流字节流BufferingBufferedReaderBufferedWriterBufferedInputSBufferedOutputFilteringFilterReaderFilterWriterFilterIntputStFilt

42、erOutputStConverting betweenbytes and characterInputStreamReader OutputStreamWriter Object Serialization ObjectInputStObjectOutputStData conversion DataInputStDataOutputStCountingLineNumnberReaderLineNumberInputStreanPeeking aheadPushbackReaderPushbackInputStreamprintingPrintWriterPrintStream处理流处理流数

43、据源数据源处理流处理流节点流节点流线程状态转换线程状态转换创建创建终止终止阻塞状态阻塞状态就绪状态就绪状态运行状态运行状态start()阻塞解除阻塞解除导致阻塞的事件导致阻塞的事件调调度度线程同步中的死锁线程同步中的死锁线程线程2线程线程1锁定锁定锁定锁定 应用层应用层表示层表示层会话层会话层传输层传输层网络层网络层数据链路层数据链路层物理层物理层应用层应用层传输层传输层网络层网络层物理物理+数据链路层数据链路层 OSI参考模型参考模型 TCP/IP参考模型参考模型最底层最底层Socket通信模型通信模型 Server Client socket.close() socket.close()OutputStream InputStreamOutputStream InputStreamServerSocket s(port #)s.accept() /等待连接等待连接Socket对象对象Socket(host,port # (Attempt toconnect)AWTComponentMenuComponentContainerWindowPanelFrameDialogAppletButtonTextAreaLabelTextFieldList. . . .事件监听事件监听事件源对象事件源对象

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号