memory management with java and c++

72
Understanding Memory Management and Garbage Collection Java and C++ Mohammad Shaker FIT of Damascus - AI dept. [email protected] Programming Languages

Upload: mohammad-shaker

Post on 22-May-2015

839 views

Category:

Education


4 download

TRANSCRIPT

Page 1: Memory Management with Java and C++

Understanding

Memory Management

and Garbage Collection

Java and C++

Mohammad Shaker

FIT of Damascus - AI dept.

[email protected]

Programming Languages

Page 2: Memory Management with Java and C++

What Is A Pointer?

Page 3: Memory Management with Java and C++

NULL Pointer

Page 4: Memory Management with Java and C++

Pointer Assignment

Page 5: Memory Management with Java and C++

Shallow and Deep Copying

Page 6: Memory Management with Java and C++

Bad Pointers

• When a pointer is first allocated, it does

not have a pointee.

• The pointer is “uninitialized” or simply

"bad".

• every pointer starts out with a bad

value.

• There is nothing automatic that gives

a pointer a valid pointee.

Page 7: Memory Management with Java and C++

Bad Pointers

IT IS NOT NULL!

Page 8: Memory Management with Java and C++

Bad Pointers – Faster?!

• Most languages make it easy to omit

this important step.

• The run-time checks are also a reason

why such languages always run at

least a little slower than a compiled

language like C or C++!

Page 9: Memory Management with Java and C++
Page 10: Memory Management with Java and C++
Page 11: Memory Management with Java and C++
Page 12: Memory Management with Java and C++

Bad Pointers - Example

void BadPointer() {

int* p; // allocate the pointer, but not the pointee

*p = 42; // this dereference is a serious runtime error

}

Page 13: Memory Management with Java and C++

Pointer Rules Summary

• A pointer stores a reference to its pointee. The

pointee, in turn, stores something useful.

• The dereference operation on a pointer accesses its

pointee. A pointer may only be dereferenced after

it has been assigned to refer to a pointee. Most

pointer bugs involve violating this one rule.

• Allocating a pointer does not automatically assign it

to refer to a pointee. Assigning the pointer to refer

to a specific pointee is a separate operation which

is easy to forget.

• Assignment between two pointers makes them refer

to the same pointee which introduces sharing.

Page 14: Memory Management with Java and C++

Large Locals Example

void X() {

int a = 1;

int b = 2;

// T1

Y(a);

// T3

Y(b);

// T5

}

void Y(int p) {

int q;

q = p + 2;

// T2 (first time through)

// T4 (second time through)

}

Page 15: Memory Management with Java and C++

Large Locals Example

Page 16: Memory Management with Java and C++

A bit harder - Bill Gates By Valuevoid B(int worth) {

worth = worth + 1;

// T2

}

void A() {

int netWorth;

netWorth = 55; // T1

B(netWorth);

// T3 -- B() did not change netWorth

}

Page 17: Memory Management with Java and C++

A bit harder - Bill Gates By Valuevoid B(int worth) {

worth = worth + 1;

// T2

}

void A() {

int netWorth;

netWorth = 55; // T1

B(netWorth);

// T3 -- B() did not change netWorth

}

Page 18: Memory Management with Java and C++

A bit harder - Bill Gates By Referencevoid B(int &worth) {

worth = worth + 1;

// T2

}

void A() {

int netWorth;

netWorth = 55; // T1

B(netWorth);

// T3 -- B() did not change netWorth

}

Page 19: Memory Management with Java and C++

A bit harder - Bill Gates By Referencevoid B(int *worth) {

*worth = *worth + 1;

// T2

}

void A() {

int netWorth;

netWorth = 55; // T1

B(&netWorth);

// T3 -- B() did not change netWorth

}

Page 20: Memory Management with Java and C++
Page 21: Memory Management with Java and C++
Page 22: Memory Management with Java and C++

Heap Memory

Page 23: Memory Management with Java and C++

Heap!

• "Heap" memory, also known as

"dynamic" memory.

• an alternative to local stack Memory.

Page 24: Memory Management with Java and C++

Facts

• Local memory is quite automatic — it is allocated automatically on function call and it is deallocated automatically when a function exits.

• Heap Lifetime– Because the programmer now controls

exactly when memory is allocated and deallocated, it is possible to build a data structure in memory, and return that data structure to the caller. This was never possible with local memory which was automatically deallocated when the function exited.

Page 25: Memory Management with Java and C++

Heap - Allocation

• Allocate 3 GIF images in the heap

each of which takes 1024 bytes of

memory.

Page 26: Memory Management with Java and C++

Heap - Deallocation

• Deallocating Gif2 image

Page 27: Memory Management with Java and C++

Simple Heap Example

Page 28: Memory Management with Java and C++

Simple Heap Example

Page 29: Memory Management with Java and C++

Simple Heap Example

Page 30: Memory Management with Java and C++
Page 31: Memory Management with Java and C++
Page 32: Memory Management with Java and C++
Page 33: Memory Management with Java and C++
Page 34: Memory Management with Java and C++
Page 35: Memory Management with Java and C++

• both values and the variables are allocated memory. However, each assignment copies into the variable’s block, not the contents of the value block, but instead its address

Page 36: Memory Management with Java and C++

• both values and the variables are allocated memory. However, each assignment copies into the variable’s block, not the contents of the value block, but instead its address

Page 37: Memory Management with Java and C++

null.toString();

• we get a NullPointerException (Java)

• we can determine whether the value

of a pointer variable is null or not, and

hence, whether we can access its

member.

Page 38: Memory Management with Java and C++

• Multiple pointers sharing a value

Page 39: Memory Management with Java and C++

Point p1 = new ACartesianPoint(50, 50);

Point p2 = p1;

p1.setX(100);

System.out.println(p2.getX());

• When p1 is assigned to p2, the pointer stored

in p1 is copied into p2, not the object itself.

Both variables share the same object, and thus, the

code will print 100 and not 50, as you might expect.

Page 40: Memory Management with Java and C++

Object Oriented Memory

Management(Java and C++)

Page 41: Memory Management with Java and C++

Foreknowledge

• A program address space:

– Code area

– Heap (Dynamic Memory Area)

– Execution Stack

Page 42: Memory Management with Java and C++

Foreknowledge

• Code area– where code to be executed is stored

• Heap– store variables and objects allocated

dynamically

– accessed with no restrictions

• Execution Stack– perform computation

– store local variables

– perform function call management

Page 43: Memory Management with Java and C++

accessed with a LIFO policy (Last In First Out)

Page 44: Memory Management with Java and C++

C++ Specific

• C++ has several other memory areas

• C++ the entire code is loaded into

code area, and neglect dynamic

loading.

Page 45: Memory Management with Java and C++

Activation Record (AR)

void f(){g();

}void g(){

h();}void h(){k();

}

Page 46: Memory Management with Java and C++

Activation Record (AR)

void f(){g();

}void g(){

h();}void h(){k();

}

Page 47: Memory Management with Java and C++

Abbreviations for AR

Page 48: Memory Management with Java and C++

Scope Activation Record (SAR)is put every time a new block is encountered

Page 49: Memory Management with Java and C++

Scope Activation Record (SAR)

• Contains:

– Local variables (declared inside the

block)

– The Static Link SL (a.k.a SAR link) a pointer to the SAR of the

immediate enclosing block; used to acce

ss local variables of outer blocks from the

current block.

Page 50: Memory Management with Java and C++

Scope Activation Record (SAR)

Page 51: Memory Management with Java and C++

References and Pointersconceptually the SAME

Page 52: Memory Management with Java and C++

Classes and ObjectsObjects are instances of classes

Page 53: Memory Management with Java and C++

Classes and ObjectsObjects are instances of classes

(Objects are classes in action)

Page 54: Memory Management with Java and C++

C++ again

• In C++ classes are truly user defined ty

pes. Objects are treated as any other

variable and are allocated:

– On the stack, as regular local variables

– On the heap, like in Java

Page 55: Memory Management with Java and C++

Java example

int[] hello = new int[5];

// reference hello is on stack, the object is on the

// heap.

hello[0] = 2;

// Java puts this value directly in same slot and doesn't // create a wrapping object.

From: http://stackoverflow.com/questions/10820787/how-does-java-treat-primitive-type-arrays

Page 56: Memory Management with Java and C++

Java: Why are wrapper classes needed?http://stackoverflow.com/questions/2134798/java-why-are-wrapper-classes-needed

Page 57: Memory Management with Java and C++

Java examplepublic class CoffeeMaker {

public CoffeeMaker(){}

}

..

..

CoffeeMaker aCoffeeMaker;

aCoffeeMaker = new CoffeeMaker();

int sugar = 4;

Integer sugarObject = new Integer(3);

Page 58: Memory Management with Java and C++

Java examplepublic class CoffeeMaker {

public CoffeeMaker(){}

}

..

..

CoffeeMaker aCoffeeMaker;

aCoffeeMaker = new CoffeeMaker();

int sugar = 4;

Integer sugarObject = new Integer(3);

Page 59: Memory Management with Java and C++

Java example

• Java objects can be accessed just

through reference variables, that hold

the address of objects in heap.

Page 60: Memory Management with Java and C++

C++ example

class CoffeeMaker {

public:

CoffeeMaker();

virtual ~CoffeeMaker();

};

// ..

CoffeeMaker aCoffeeMaker;

CoffeeMaker *aPtrCoffeeMaker = new CoffeeMaker();

CoffeeMaker &aRefCoffeeMaker = aCoffeeMaker;

aRefCoffeeMaker = *aPtrCoffeeMaker; // dangerous!

int sugar = 4;

int *ptrSuger = new int;

int &aRefSugar = sugar;

Page 61: Memory Management with Java and C++

C++ example

Page 62: Memory Management with Java and C++

Stack and Heap comparison

Page 63: Memory Management with Java and C++

Issues for objects in memory (Java)

• Objects with no references pointing to

them are considered eligible for

automatic garbage collection by the

system, which runs periodically and

performs the real destruction of the

objects.

• GC is not directly under control of the

programmer.

Page 64: Memory Management with Java and C++

Issues for objects in memory (C++)

• After an object has been created on

the heap (with the new directive) it

survives until someone destroys it

explicitly using the delete directive.

• This could lead to memory leaks

– if the programmer forgets to delete

objects no longer needed, they remain

on the heap as wasted space

Page 65: Memory Management with Java and C++

Methods (Java)public class CoffeeMaker {

public void prepareCoffee() {}

public void prepareCoffeeSweet(int sugarAm){}

void main(...) {

CoffeeMaker aCoffeeMaker;

aCoffeeMaker = new CoffeeMaker();

aCoffeeMaker.prepareCoffee();

}

}

Page 66: Memory Management with Java and C++

Methods (Java)public class CoffeeMaker {

public void prepareCoffee() {}

public void prepareCoffeeSweet(int sugarAm){}

void main(...) {

CoffeeMaker aCoffeeMaker;

aCoffeeMaker = new CoffeeMaker();

aCoffeeMaker.prepareCoffee();

}

}

Page 67: Memory Management with Java and C++

Methods (C++)class CoffeeMaker {

public:

void prepareCoffee() {}

void prepareCoffeeSweet(int sugarAm){}

void main(...) {

CoffeeMaker *aPtrCoffeeMaker;

aPtrCoffeeMaker = new CoffeeMaker;

aPtrCoffeeMaker-> prepareCoffee();

}

}

Page 68: Memory Management with Java and C++

Methods (C++)class CoffeeMaker {

public:

void prepareCoffee() {}

void prepareCoffeeSweet(int sugarAm){}

void main(...) {

CoffeeMaker *aPtrCoffeeMaker;

aPtrCoffeeMaker = new CoffeeMaker;

aPtrCoffeeMaker-> prepareCoffee();

}

}

Page 69: Memory Management with Java and C++

Understanding

Garbage Collection

Page 70: Memory Management with Java and C++

Read!

• http://www.simple-talk.com/dotnet/.net-framework/understanding-

garbage-collection-in-.net/

• http://en.wikibooks.org/wiki/C_Programming/Memory_management

• (.pdf) Garbage Collection: Automatic Memory Management in the

Microsoft .NET Framework

Page 71: Memory Management with Java and C++

Dangerous Finalize()!

Page 72: Memory Management with Java and C++

Keep goin’