当我们执行main方法的时候,我们就创建了一个线程,然后在线程里面创建了栈,执行方法,当碰到new的时候我们就在堆里面创建了一个新的对象。
编译类首先找到这个类然后把代码加载到空间里面,然后方法区里面就应该有类的信息了。main方法也是静态方法,执行main方法的时候就会在栈里面开辟一个栈帧,new的时候就会在堆里新建一个对象,每个对象有一个地址。
方法区其实也在堆里面
因为方法区的作用比较特殊,所以我们单独列出来
我们启动一个程序的时候,这个程序会包含很多的线程
我们方法执行的相关调用都在栈里面
每个方法被调用都会创建一个栈帧
我们的虚拟机会为每一个线程创建一个栈我们启动一个程序的时候,这个程序会包含很多的线程。jvm会为每个线程创建一个独立的栈,多个线程之间都是独立的,不能共享。
1。单进程单线程:一个人在一个桌子上吃菜。
2。单进程多线程:多个人在同一个桌子上一起吃菜。
3。多进程单线程:多个人每个人在自己的桌子上吃菜。
多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。。。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。
局部变量都在方法里面放着,然后这个方法里面又调用一个新的方法,原来的方法没有关闭。
我们方法执行的相关调用都在这个栈里面,每个方法被调用的时候都会创建一个栈帧。
一个线程里面有一个栈,栈里面有多个栈帧,它们遵循的是先进后出原则。
栈是一个连续的空间,不像堆是乱放的
当我们new对象的时候就说明堆里面多了一个对象
用static修饰的都叫静态方法
当我们在调用main方法的时候就会开辟一个栈帧
建好的堆里面的每个对象都有一个地址,每个对象叫一个内存块。
通过栈来找堆里面的对象对应的属性和方法
栈里面可以存放实际参数和局部变量等