Java SE 运行时 内存分析

1 .Java 程序运行时内存的逻辑分配

      method area, stack ,heap ,native method stack

      In method area------ there are information about class which loaded.

      In heap------there are array and obj created by new operation

      In stack------local variance area ,operater number stack

      In native method stack 内存------


Java SE 运行时 内存分析_第1张图片
内存结构

2. Java 栈(JVM stack)

   Jvm stack 是程序运行时的单位

   just like this

Java SE 运行时 内存分析_第2张图片
jvm stack

In java,每个thread 都有自己的jvm stack,因为 jvm stack 存储着thread的执行逻辑。

3. let us talk about  Java Heap.

   Firstly,Java Heap divided to different generations.just like this:

Java SE 运行时 内存分析_第3张图片
Java    Heap

Then we can see when we create a String obj,how it stored in java heap:just like this:


Java SE 运行时 内存分析_第4张图片
obj and value

extends:String str=new String("123");

if there is no 123 in constant var in pool ,it will create in pool firstly, then create it in heap,just like this:


Java SE 运行时 内存分析_第5张图片
creat string

please think when string is local variance,what happens?


4:we can talk about 值传递和引用传递 now

摘自知乎:链接:

    https://www.zhihu.com/question/31203609/answer/50992895

in order to know what is 值传递 and what is 引用传递,we make sense the difference between 基本类型 和 引用类型


Java SE 运行时 内存分析_第6张图片
基本类型和引用类型

其中a是基本类型,值就保存在变量a中,而string是引用类型,变量中保持的是实际对象的地址。一般称这种变量为引用。

how the “=” work

if 

         int num = 10;

         String str = "hello";

Java SE 运行时 内存分析_第7张图片
state1

now we do this

                num = 20;

                str = "java";

it works just like this:


Java SE 运行时 内存分析_第8张图片
state2

from above two pictures,the conclusion is:

对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。

对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。

     调用方法时发生了什么???

      ------参数传递基本上就是赋值操作------

example 1 :基本类型

     void foo(int value) {

          value = 100;

          }

foo(num); // num 没有被改变,因为传递只是num的值。


example2 :引用类型,但该引用类型没有提供改变自身的方法。如String

void foo(String text) {

              text = "windows";

              }

foo(str); // str 也没有被改变

example 3:引用类型,该类型提供了改变自身的方法。

StringBuilder sb = new StringBuilder("iphone");

      void foo(StringBuilder builder) {

      builder.append("4");

      }

foo(sb); // sb 被改变了,变成了"iphone4"。

example4:同example3,提供改变自身方法的引用类型,但是不使用,使用赋值运算。

   StringBuilder sb = new StringBuilder("iphone");

  void foo(StringBuilder builder) {

  builder = new StringBuilder("ipad");

        }

       foo(sb); // sb 没有被改变,还是 "iphone"。





 


























     

你可能感兴趣的:(Java SE 运行时 内存分析)