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 内存------


内存结构

2. Java 栈(JVM stack)

   Jvm stack 是程序运行时的单位

   just like this

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    Heap

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


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:


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 基本类型 和 引用类型


基本类型和引用类型

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

how the “=” work

if 

         int num = 10;

         String str = "hello";

state1

now we do this

                num = 20;

                str = "java";

it works just like this:


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"。





 


























     

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,775评论 0 33
  • 集合框架: 1)特点:存储对象;长度可变;存储对象的类型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang阅读 1,286评论 0 4
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,142评论 0 62
  • 自我效能感讲述了“通过自己的努力完成一件事情的自信程度”。 我们都知道我们相对于婴儿完成一件事情很简单,但是当一...
    合肥李风丽阅读 305评论 0 0