26
Objects and memory Objects and memory The stack The heap Variable life and death null Clones Serializing objects

Objects and memory

  • Upload
    tameka

  • View
    50

  • Download
    0

Embed Size (px)

DESCRIPTION

Objects and memory. The stack The heap Variable life and death null Clones Serializing objects. Memory: A programmer’s prospective. Recall: Memory can be viewed as a sequence of numbered ‘storage boxes’ Essentially memory is an array - PowerPoint PPT Presentation

Citation preview

Page 1: Objects and memory

Objects and memoryObjects and memory

The stack

The heap

Variable life and death

null

Clones

Serializing objects

Page 2: Objects and memory

2Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory: A programmer’s prospectiveMemory: A programmer’s prospective

Recall: Memory can be viewed as a sequence of numbered ‘storage boxes’– Essentially memory is an array

The compiler decides (on our behalf) where variables will live in memory (their address)

0‘a’140

000000000

. . .

x0000x0001x0002x0003x0004x0005x0006x0007x0008

xFFFDxFFFExFFFF

public static void main (String[] args) { int x = 0; char c = ‘a’; double dx = 140000000000; …} // end method main

Name Type Length Address

x int 1 x0001

c char 1 x0002

dx double 2 x0003

Symbol Table

Page 3: Objects and memory

3Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory: A programmer’s prospectiveMemory: A programmer’s prospective

Areas of memory are allocated for the different types of things that need to be stored

– Operating System routines

– The executable code

– Static/global variables

– Dynamically created objects Instance variables Memory needs grow/shrink during execution of the

program. The compiler has no idea how much space you might

need (may depend on input, etc)

– Local variables (a.k.a. stack variables) Memory requirements change as variables local to the

method come into and out of scope

The amount of available memory is system dependent

OS

code

globals

heap

stack

Page 4: Objects and memory

4Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Types of variablesTypes of variables

public class Main { public static int number; public static void main (String[] args) { System.out.println(number); } end method main} // end class main

public class Point { int x; int y;} // end class Point

public int foo (int bar){ int temp = bar + 1; return temp;} // end class Point

Static/global variable: number

Instance variables: x, y

Local/stack variables: bar, temp

OS

code

globals

heap

stack

Page 5: Objects and memory

5Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Before first line of main executes

Page 6: Objects and memory

6Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Point: x

Point: y

After “new” but before constructor is executed

Page 7: Objects and memory

7Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main:() args

main(): p1

main(): p2

Point(): yValue 2

Point(): xValue 1

Point: x

Point: y

constructor is about to begin

Page 8: Objects and memory

8Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Point(): yValue 2

Point(): xValue 1

Point: x 1

Point: y 2

constructor is about to finish

Page 9: Objects and memory

9Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Point: x 1

Point: y 2

Execution of the first line of main complete

Page 10: Objects and memory

10Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Point: x 1

Point: y 2

Preparing to execute makePoint

makePoint(): x 4

makePoint(): y 3

Page 11: Objects and memory

11Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Point: x 1

Point: y 2

makePoint, after new, before constructor called

makePoint(): x 4

makePoint(): y 3

Point: x

Point: y

makePoint(): p1

Page 12: Objects and memory

12Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Point: x 1

Point: y 2

makePoint near end of constructor call

makePoint(): x 4

makePoint(): y 3

Point: x 3

Point: y 4

makePoint(): p1

Point(): yValue 4

Point(): xValue 3

Page 13: Objects and memory

13Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } //end method main} // end class Point

main(): args

main(): p1

main(): p2

Point: x 1

Point: y 2

makePoint near end of constructor call

makePoint(): x 4

makePoint(): y 3

Point: x 3

Point: y 4

makePoint(): p1

Page 14: Objects and memory

14Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory in actionMemory in action

globals

heap

stack

public class Point { int x; int y; Point (int xValue, int yValue) { x = xValue; y = yValue; } // end constructor Point makePoint (int x, int y) { Point p1 = new Point(x,y); return p1; } // end method Point

static void main (String[] args) { Point p1 = new Point(1,2); Point p2 = makePoint(3,4); } end method main} // end class Point

main(): args

main(): p1

main(): p2

Point: x 1

Point: y 2

end of main

Point: x 3

Point: y 4

Page 15: Objects and memory

15Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Methods are stackedMethods are stacked

When you call a method, its frame is pushed on the call stack

– Frame: The ordered set of local variables that belong to a method

– Stack: A list in which a data structure can be removed only if all objects added more recently than it are first removed. FILO.

– A method stays on the stack until it ends (hits it closing curly brace).

– If the foo() method calls the bar() method then the frame for bar() is stacked on top of foo(). When bar completes, it (and all its variables) are removed (poof!) and foo() continues.

All local variables exist in/on the stack, in the stack frame for the method call.

– If the variable exists, it is alive If another frame is on top of it, however, it is out of scope

– If the method ends then the variable no longer exists in memory In Java, local variables get a default initialization of 0. Not true in C++!

Page 16: Objects and memory

16Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Stack TraceStack Trace

Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: 3 at java.lang.String.charAt(Unknown Source) at Coordinate.getStatus (Coordinate: 67) at Ship.getLocation (Ship: 15) at GameBoard.checkTarget (GameBoard.java: 108) at GameBoard.play (GameBoard.java: 54) at Main.main (Main.java: 23)

We have caught an exception due to trying to reference a character beyond the end of a string, and printed its stack trace.

• The stack trace shows us the flow of method calls from the instantiation of the program until the error occurred, and shows us the order of methods present on the stack.

Page 17: Objects and memory

17Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Objects are allocatedObjects are allocated

When you create an object instance memory is allocated on the heap.

– There is NO WAY to create an object other than someone, somewhere using new on the class type

– An object instance needs a place to store its instance variables.

– The instance variables determine the size of the data structure.

– heap: Essentially, a list in which data structures can be added or removed in any order and at any time.

– Objects can be allocated anywhere in the heap where there is space (not necessarily adjacent to each other)

– Any number of instances can be created, each starting at a unique address/location in the heap.

Object reference variables (which could be static, local, or instance) hold the reference/location of the object on the heap

– no live variable with reference <==> object is inaccessible garbage

Page 18: Objects and memory

18Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Static variables have a permanent homeStatic variables have a permanent home

When you create a static variable, it is assigned a permanent location in memory

– A static variable is always live (from the time the class is loaded at start until the program ends)

Static variables don’t exist in the object’s data structure in the heap

– This is why a static variables has the same value for all instances of a class. They all refer to the same memory location

You should always assign an initial value to static variables

– In Java and C++, static variables are assigned a default value of 0

Page 19: Objects and memory

19Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

nullnull

What value should an object reference variable have BEFORE an object is created and stores its reference in the variable?

null

– is a keyword

– can be stored in a reference variable

– Indicates that the variable current refers to no existing object The concept of null is particularly important in languages without

garbage collection, as references may be stored to objects that have been destroyed

In general, methods have a precondition that the parameters contain valid object references.

– Best practices imply that one should always test for null references before using an object reference passed as a parameter

if( x == null) …

Page 20: Objects and memory

20Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Example: MemoryExample: Memory

What is the likely intention of this class? What are the static, instance, and local variables? This code compiles without error. When executed, you get a runtime

exception: StackOverflowError. Why and how?

public class PointList extends Point { PointList nextPoint = new PointList (); static PointList firstPoint;

PointList () {super(0,0);

} // end constructor

public static void main (String[] args) { PointList list = new PointList(); list = null; } // end method main} // end class Point

Page 21: Objects and memory

21Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Aggregate objectAggregate object

public class Deck { private ArrayList<Card> cardsInDeck; … public Card topCard() { return cardsInDeck.get(0); } // end method topCard} // end class Deck

DeckcardsInDeck:

ArrayList

Cardsuit:rank:

Cardsuit:rank:

Cardsuit:rank:

String“Heart”

String“Two”

String“Club”

String“Seven”

String“Spade”

String“Queen”

Are cards private or not?

Page 22: Objects and memory

22Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Memory and encapsulationMemory and encapsulation

public class Poker { … public void cheat () { Card topCard = topCard(); topCard.setRank(“Ace”); } // end method cheat} // end class Poker

DeckcardsInDeck:

ArrayList

Cardsuit:rank:

Cardsuit:rank:

Cardsuit:rank:

String“Heart”

String“Two”

String“Club”

String“Seven”

String“Spade”

String“Queen”

cheat(): topCard

Page 23: Objects and memory

23Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Security and encapsulationSecurity and encapsulation

When an accessor method exists to provide access to a private object: Do not return the reference to the actual field object

– This would allow the external program to access/change the object without going through the appropriate mutator method!

Instead, return a copy of the object.

– This provides all the same information

– But changes to the copy do not affect the original!

You have to make a new object Wouldn’t it be great if we had a constructor that made this easy?

Page 24: Objects and memory

24Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Copy constructorsCopy constructors

Copy constructor: A constructor that accepts an object of the same class as an argument and makes an “identical” copy.

public class Deck { private ArrayList<Card> cardsInDeck; … public Card topCard() { return new Card(cardsInDeck.get(0)); } // end method topCard} // end class Deck

public class Card { public Card (Card originalCard) { this.setSuit(originalCard.getSuit()); this.setRank(originalCard.getRank()); } // end copy constructor …} // end class Card

Why are Strings Immutable in Java?

Page 25: Objects and memory

25Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Shallow CopyShallow Copy

public class Deck { private ArrayList<Card> cardsInDeck; …

public Deck (Deck originalDeck) { this.cardsInDeck = new ArrayList<Card>(); for (Card card : cardsInDeck) {

this.cardsInDeck.add(card); } } // end (SHALLOW) copy constructor

} // end class Deck

Deck ArrayList Cards

Page 26: Objects and memory

26Wright State University, College of EngineeringDr. T. Doom, Computer Science & Engineering

CS 241Computer Programming II

Deep CopyDeep Copy

To create a secure copy, you cannot forward any reference to any object (except immutable objects) in your aggregation

Style: well designed objects should have a copy constructor that uses the copy constructors of the objects that it holds to ensure a deep copy

public class Deck { private ArrayList<Card> cardsInDeck; …

public Deck (Deck originalDeck) { this.cardsInDeck = new ArrayList<Card>(); for (Card card : cardsInDeck) {

this.cardsInDeck.add(new Card(card)); } } // end (SHALLOW) copy constructor

} // end class Deck

Deck ArrayList Cards