Skip to content

Commit

Permalink
Hi oldSpaceRememberedSet for perm objects
Browse files Browse the repository at this point in the history
  • Loading branch information
PalumboN committed Apr 15, 2022
1 parent 952d791 commit 4b6af2f
Show file tree
Hide file tree
Showing 6 changed files with 355 additions and 163 deletions.
13 changes: 12 additions & 1 deletion smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,7 @@ SpurGenerationScavenger >> initialize [
tenureThreshold := 0.
statSurvivorCount := statTenures := 0.
scavengeLogRecord := SpurScavengeLogRecord new.
rememberedSet := SpurRememberedSet eden: eden
rememberedSet := SpurRememberedSet new.
]

{ #category : #'remembered set' }
Expand Down Expand Up @@ -739,6 +739,7 @@ SpurGenerationScavenger >> newSpaceStart: startAddress newSpaceBytes: totalBytes
pastSpace start: startAddress; limit: startAddress + survivorBytes.
futureSpace start: pastSpace limit; limit: pastSpace limit + survivorBytes.
eden start: futureSpace limit; limit: startAddress + totalBytes.
rememberedSet fudge: self rememberedSetFudge.

self assert: self futureSpace limit <= (startAddress + totalBytes).
self assert: self eden start \\ manager allocationUnit
Expand Down Expand Up @@ -962,6 +963,16 @@ SpurGenerationScavenger >> remember: anOop [
rememberedSet remember: anOop
]

{ #category : #'remembered set' }
SpurGenerationScavenger >> rememberedSetFudge [

<inline: true>
"fudge is a minimum below which we don't care about growing the Remembered Set.
It is chosen so that with a default 4Mb new space, the Remembered Set is not considered
full until it has from 512 to 1024 entries."
^ eden limit - eden start / manager wordSize // 1024.
]

{ #category : #accessing }
SpurGenerationScavenger >> rememberedSetLimit [

Expand Down
108 changes: 76 additions & 32 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,8 @@ Class {
'statMaxAllocSegmentTime',
'unscannedEphemeronsQueueInitialSize',
'permSpaceFreeStart',
'permSpaceDirty'
'permSpaceDirty',
'oldSpaceRememberedSet'
],
#classVars : [
'BitsPerByte',
Expand Down Expand Up @@ -6344,6 +6345,7 @@ SpurMemoryManager >> initialize [
scavenger := SpurGenerationScavenger simulatorClass new manager: self; yourself.
segmentManager := SpurSegmentManager simulatorClass new manager: self; yourself.
compactor := self class compactorClass simulatorClass new manager: self; yourself.
oldSpaceRememberedSet := SpurRememberedSet new manager: self; yourself.
"We can also initialize here anything that is only for simulation."
heapMap := CogCheck32BitHeapMap new.
Expand Down Expand Up @@ -6520,6 +6522,7 @@ SpurMemoryManager >> initializeObjectMemory: bytesToShift [
self initializeOldSpaceFirstFree: freeOldSpaceStart. "initializes endOfMemory, freeStart, free space"
self initializeNewSpaceVariables.
scavenger initializeRememberedSet.
oldSpaceRememberedSet initializeRememberedSet.
segmentManager checkSegments.
compactor biasForGC.
Expand Down Expand Up @@ -8655,50 +8658,65 @@ SpurMemoryManager >> mournQueue: anOop [
]
{ #category : #'perm - space' }
SpurMemoryManager >> moveToPermSpace: objOop [
SpurMemoryManager >> moveToPermSpace: objOop [
<inline: false>
| numSlots fmt newObj hash |
| numSlots fmt newObj hash shouldBeRemembered |
"Clonning in permSpace"
numSlots := self numSlotsOf: objOop.
fmt := self formatOf: objOop.
(self isPointersFormat: fmt)
ifTrue: [
self primitiveFailFor: PrimErrBadReceiver.
^ nil ].
"Only accept objects in old space?"
(self isPointersFormat: fmt) ifTrue: [
self primitiveFailFor: PrimErrBadReceiver.
^ nil ].
fmt >= self firstCompiledMethodFormat ifTrue: [
self primitiveFailFor: PrimErrBadReceiver.
^ nil ].
newObj := self allocateSlotsInPermSpace: numSlots
bytes: (self objectBytesForSlots: numSlots)
format: fmt
classIndex: (self classIndexOf: objOop).
newObj ifNil: [
newObj := self
allocateSlotsInPermSpace: numSlots
bytes: (self objectBytesForSlots: numSlots)
format: fmt
classIndex: (self classIndexOf: objOop).
newObj ifNil: [
self primitiveFailFor: PrimErrNoMemory.
^ nil].
0 to: numSlots - 1 do:
[:i|
self storePointerUnchecked: i
^ nil ].
shouldBeRemembered := false.
0 to: numSlots - 1 do: [ :i | | referenced |
referenced := self fetchPointer: i ofObject: objOop.
(self isInOldSpace: referenced) ifTrue: [ shouldBeRemembered := true ].
self
storePointerUnchecked: i
ofObject: newObj
withValue: (self fetchPointer: i ofObject: objOop)].
withValue: referenced ].
(hash := self rawHashBitsOf: objOop) ~= 0 ifTrue: [self setHashBitsOf: newObj to: hash].
(self isObjImmutable: objOop) ifTrue: [self setIsImmutableOf: newObj to: true].
(self isRemembered: objOop) ifTrue: [
scavenger rememberedSet replace: objOop with: newObj ].
shouldBeRemembered ifTrue: [
oldSpaceRememberedSet remember: newObj ].
(hash := self rawHashBitsOf: objOop) ~= 0 ifTrue: [
self setHashBitsOf: newObj to: hash ].
(self isObjImmutable: objOop) ifTrue: [
self setIsImmutableOf: newObj to: true ].
becomeEffectsFlags := self becomeEffectFlagsFor: objOop.
self forward: objOop to: newObj.
self followSpecialObjectsOop.
coInterpreter postBecomeAction: becomeEffectsFlags.
self postBecomeScanClassTable: becomeEffectsFlags.
becomeEffectsFlags := 0.
^newObj
^ newObj
]
{ #category : #'become implementation' }
Expand Down Expand Up @@ -8870,6 +8888,12 @@ SpurMemoryManager >> newSpaceRefCountMask [
bitOr: 1 << self rememberedBitShift)
]
{ #category : #accessing }
SpurMemoryManager >> newSpaceRememberedSet [
^ scavenger rememberedSet
]
{ #category : #accessing }
SpurMemoryManager >> newSpaceSize [
^(freeStart - scavenger eden start)
Expand Down Expand Up @@ -9505,6 +9529,12 @@ SpurMemoryManager >> oldSpaceObjectAfter: objOop [
^self objectAfter: objOop limit: memoryMap oldSpaceEnd
]
{ #category : #accessing }
SpurMemoryManager >> oldSpaceRememberedSet [
^ oldSpaceRememberedSet
]
{ #category : #accessing }
SpurMemoryManager >> oldSpaceSize [
^segmentManager totalBytesInSegments
Expand Down Expand Up @@ -9712,6 +9742,13 @@ SpurMemoryManager >> positiveMachineIntegerValueOf: integerValue [
^coInterpreter positiveMachineIntegerValueOf: integerValue
]
{ #category : #'store check' }
SpurMemoryManager >> possiblePermStoreInto: destObj [
<inline: true>
(self isRemembered: destObj) ifFalse:
[oldSpaceRememberedSet remember: destObj]
]
{ #category : #'store check' }
SpurMemoryManager >> possibleRootStoreInto: destObj [
<inline: true>
Expand Down Expand Up @@ -11809,17 +11846,24 @@ SpurMemoryManager >> storePointer: fieldIndex ofObjStack: objStackPage withValue
{ #category : #'object access' }
SpurMemoryManager >> storePointer: fieldIndex ofObject: objOop withValue: valuePointer [
<api>
"Note must check here for stores of young objects into old ones."
<api>
self assert: (self isForwarded: objOop) not.
(memoryMap isOldObject: objOop) ifTrue: "most stores into young objects"
[(self isYoung: valuePointer) ifTrue:
[self possibleRootStoreInto: objOop]].
(self isYoung: objOop) not ifTrue: [ "most stores into young objects"
(self isYoung: valuePointer) ifTrue: [
self possibleRootStoreInto: objOop ] ].
^self
longAt: objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
put: valuePointer
(self getMemoryMap isPermanentObject: objOop) ifTrue: [
(self getMemoryMap isOldObject: valuePointer) ifTrue: [
self possiblePermStoreInto: objOop ] ].
^ self
longAt:
objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
put: valuePointer
]
{ #category : #'object access' }
Expand Down
44 changes: 21 additions & 23 deletions smalltalksrc/VMMaker/SpurRememberedSet.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Class {
#superclass : #VMClass,
#instVars : [
'manager',
'eden',
'fudge',
'rememberedSetSize',
'rememberedSetLimit',
'rememberedSetArray',
Expand All @@ -14,21 +14,7 @@ Class {
#category : #VMMaker
}

{ #category : #'as yet unclassified' }
SpurRememberedSet class >> eden: newSpace [

^ self new
eden: newSpace;
yourself
]

{ #category : #accessing }
SpurRememberedSet >> eden: anObject [

eden := anObject
]

{ #category : #'gc - global' }
{ #category : #'store check' }
SpurRememberedSet >> forgetObject: objOop [

self assert: rememberedSetSize > 0.
Expand All @@ -47,6 +33,12 @@ SpurRememberedSet >> forgetObject: objOop [
self assert: rememberedSetSize >= 0
]

{ #category : #accessing }
SpurRememberedSet >> fudge: anObject [

fudge := anObject
]

{ #category : #'remembered set' }
SpurRememberedSet >> growRememberedSet [
| obj numSlots newObj base |
Expand Down Expand Up @@ -87,7 +79,8 @@ SpurRememberedSet >> hasSameSize [
SpurRememberedSet >> initialize [

rememberedSetSize := 0.
numRememberedEphemerons := 0
numRememberedEphemerons := 0.
fudge := 0
]

{ #category : #initialization }
Expand Down Expand Up @@ -213,7 +206,6 @@ SpurRememberedSet >> remember: objOop [
self deny: (manager getMemoryMap isYoungObject: objOop).
self deny: (manager isRemembered: objOop).
self deny: (self isInRememberedSet: objOop).
self deny: (manager getMemoryMap isPermanentObject: objOop).

manager setIsRememberedOf: objOop to: true.
rememberedSetSize >= rememberedSetLimit ifTrue:
Expand Down Expand Up @@ -325,6 +317,16 @@ SpurRememberedSet >> removeObjectAt: anIndex [
at: anIndex put: (rememberedSetArray at: rememberedSetSize)
]

{ #category : #accessing }
SpurRememberedSet >> replace: oldOop with: newOop [

self rememberedSetWithIndexDo: [ :oop :index |
oop = oldOop ifTrue: [
manager setIsRememberedOf: oldOop to: false.
manager setIsRememberedOf: newOop to: true.
^ self save: newOop at: index ] ]
]

{ #category : #accessing }
SpurRememberedSet >> save: anOop at: index [

Expand All @@ -333,12 +335,8 @@ SpurRememberedSet >> save: anOop at: index [

{ #category : #'remembered set' }
SpurRememberedSet >> setRememberedSetRedZone [
| fudge |

<inline: true>
"fudge is a minimum below which we don't care about growing the Remembered Set.
It is chosen so that with a default 4Mb new space, the Remembered Set is not considered
full until it has from 512 to 1024 entries."
fudge := eden limit - eden start / manager wordSize // 1024.
rememberedSetRedZone := rememberedSetLimit * 3 // 4 max: fudge
]

Expand Down
1 change: 1 addition & 0 deletions smalltalksrc/VMMakerTests/VMSpurMemoryManagerTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ VMSpurMemoryManagerTest >> initializeOldSpaceForScavenger [
firstClassTablePage := memory fetchPointer: 0 ofObject: memory hiddenRootsObject.

memory scavenger initializeRememberedSet.
memory oldSpaceRememberedSet initializeRememberedSet.
memory scavenger remember: memory hiddenRootsObject.
memory scavenger remember: firstClassTablePage.
memory specialObjectsOop: (self newObjectWithSlots: 60).
Expand Down

0 comments on commit 4b6af2f

Please sign in to comment.