【JVM】基础

1、对象为什么放到堆里面?

  对象放到堆里面,可以实现多个对象共享。可能会引起一些安全问题

2、栈是运行时的单位和线程绑定,堆是存储的单位。局部变量没有线程安全问题,因为它不是共享的。

  栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放,放在哪儿。Java中一个线程就会相应有一个线程与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关的信息的。包括局部变量、程序运行状态、方法返回值灯;而堆只负责存储对象信息

3、CPU上下文切换,两个线程之间是怎么调度的?

  相同线程的运行机制是一样的情况下,CPU会给每一个线程分配一个时钟,只要过了这个时钟,CPU会把当前线程挂起,挂起完之后,CPU会把当前线程执行的一个快照保存起来,然后执行下一个线程,往返执行,在执行下个线程的时候,会把当前线程的快照恢复起来,这样保存了程序的运行状态,在java里面应用了程序计数器PC计数器来保存程序的运行状态。

5、为什么不把基本类型放堆中呢?

  因为其占用的空间一般是1到8个字节,需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况,长度比较固定,因此栈中存储就够了。如果把他存在堆中是没有什么意义的。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的,但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据,一个是堆中的数据。

6、堆中存什么?栈中存什么?

  堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4byte的引用

7、栈和堆中的数据是怎样关联到一起的?

  首先栈中存放的是基本类型和引用;引用通过引用地址去和堆中的指定对象关联起来,然后将对象的数据返回到栈中,栈中经过运算再将对象的状态保存到堆中。但是当不同的栈同时去堆中取同一个对象的时候,这个时候双方可以能都会读取到脏数据。解决方式如下:
  将请求方式串行化,存放在队列中。
  mipi协议:CPU的同步协议

猜你喜欢

转载自blog.csdn.net/zlt995768025/article/details/80558309