数据什么时候在堆中
什么时候在栈中

堆跟数据结构中的堆没关系!!!!!!!!!!!!

为什么很多高级语言都把这个叫做堆?

最早Lisp这种语言,的确是用堆来管理内存的。
之后不用堆来管理了,但是沿用了这种说法。

那为什么还有栈呢?

函数是在栈中滴

函数调用栈……main()不是栈底,main()之前还有好几个函数

栈里存什么

local变量

image.png
假设函数调用
main===》》obj.a()
a是普通对象的一个方法
有一个参数,如果参数是基本变量,那么直接存栈,如果是对象,存对象的引用
然后才是local 变量
对象的引用

堆里存什么?

栈里存对象
而且每个线程一个栈
整个JVM一个堆

线程跟线程之间的数据共享是靠堆实现的。

为什么方法里定义的变量必须初始化?

不初始化的话栈里没有这个变量的位置。

image.png

高并发开发

极端情况
高并发的难点在于自己的应用服务,而不在于使用的底层技术(比如GC)
JVM的参数应该充分服务于应用服务

先把增删改查做好。

大多数准备都是在解决极端情况。