Java and memory
I am confused about memory stuff. As i know there are 4 areas in the memory which is : text, static/global,stack, heap. But all articles what i found on java is talking just about the stack and the heap. What about other areas ? And also as i know the static objects are stored in the static area of the memory, but i found that in java they are stored in a section of the heap called PERMGEN and for the recent versions of java the storing is performed in a METASPACE section. Can anyone clarify for me pl
8/16/2018 10:56:07 AMDe Vinci
17 AnswersNew Answer
Java and C++ dosn't manage memory the same way, the main difference between is that Java use garbage collection and the JVM manages almost everything, you have no access to where the JVM puts your data and your code. whereas in C++ the program is directly executing on the machine and memory is managed through OS services. Everything works on the hardware, so you will have stack segments, data segments. In Java, everything is also represented at runtime, so you can ask an object what class it belongs to and what method is supports. In C++, classes have no representation in memory at runtime.
Dababi Mohamed Amine I didn't understand what you mean by "In C++, classes have no representation in memory at runtime", can you elaborate some more on this fact?
This is a good article that shows you the differents parts of the memory. Note that Permgem is not part of the heap. https://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java
Dababi Mohamed Amine excellent link! thank you :)
Dababi Mohamed Amine Thank you for detailed answer, anyways, when you wrote "They are treated as any other variable and can be allocated on the stack ...", were you referring to classes or objects? Also can you please explain how a static method works in C++ given the fact that classes have no representations in memory during runtime.
I read that Heap have 3 levels for objects that live long time. Know only about Permgen, Heam and Stack thats enough for me.
does not java have parts of memory like c and c++?
thank you khouya mohamed
@lpang In Java objects are created using the keyword new. They can only be instantiated in heap. Java objects can be accessed through reference variables, that hold the address of objects in heap. Objects with no references pointing to them are considered eligible for automatic garbage collection by the system In C++ classes are user defined types. They are treated as any other variable and can be allocated on the stack as regular local variables or on on the heap like in Java. Objects can be accessed through pointers. After an object has been created on the heap (with the new directive) it survives until someone destroys it explicitly using the delete directive. On the other hand, local objects, which are allocated on the stack, always have a defined life time such objects are automatically deleted when they go out of scope.
lpang i was referring to object. for static members they are stored with global variables. in fact, they live in the global memory which is separated from the heap and the stack. They are stored in the data segment (initialized data sections .data and uninitialized .bss) which is burned in the executable and have typically a fixed size(im not sure about the size).
Dababi Mohamed Amine Thank you so much for your answer, so my assumption, to conclude over this, in C++ classes don't have representation in memory at runtime. A class is stored in data segment, and when a static method of a certain class is needed to be invoked, the class is temporarily loaded into memory, the static method is invoked, and then the class representation is removed from memory? am I understanding this correctly?
yes static members are stored in the data segment unlike the heap which is allocated by system in runtime. for the method of invocation im not sure that it works this way. to go in depth you can also read about virtual methods because they are stored differently in memory.
ok thanks..the data segment exists in the metaspace ?
thank you so much my friend..you were very helpful :)
please guys, static and global, are the same ?
not they are not the sa me. the main difference is the scope. A global variable has global scope, and is visible everywhere in your program. A static variable can have local scope. In memory, the two of them resides in the data segment.
the data segment is part of your executable