JMM

首先要说JMM 是啥。为啥要关心JMM。
JMM全程是java 内存 模型 ,说到底是讲一个java程序到底是如何分配内存的。不了解这个,后面的线程安全,后面的垃圾回收就没有理论基础了,更别说什么虚拟机优化了。

java把内存分成了

程序计数器(Program Counter Register)
Java栈(VM Stack)
本地方法栈(Native Method Stack)
方法区(Method Area)
堆(Heap)

程序计数器 你编程基本用不到这是jvm自己用的。

然后是方法区,这里原来设计是存放虚拟机加载类的相关信息,如类、静态变量和常量,大小由-XX:PermSize和-XX:MaxPermSize来调节,最直观的感受就是Class信息。比如你自己估计写了几百个类占不了多少内存。但是用了很多第三方jar。经常启动的时候就告诉你内存不够。但是jdk1.8之后部分比如静态变量,常量池就挪走了。但是类信息这一块还是保留的。换成了元空间。

接下来是两个栈 java栈跟本地方法栈
栈只是用来执行一条一条命令的,你的命令是怎么体现,是不是程序中的方法。栈就是用来执行方法用的,一条语句入栈出栈。根据java自己的方法。以及执行底层方法。又划分成了java栈跟本地方法栈。理解这个内存区域最直观的就是执行递归程序死循环,一会就报栈溢出。因为你老是入栈。一会就满了。

最后才是堆,你所有new 的对象还有数组啊都是放在堆里。之后现在常量池也是放到了堆。反正新分配内存。都放到这里头。所以new对象多了。然后就报堆内存溢出了。

堆内存跟方法区的内存 被划分为主内存。 主内存是共享的。但是这些主内存都是怎么修改的,往下看

了解完这个基本概念后要进入下一个块实际一点的内容,就是我们写代码的时候 每一个变量都是放在哪里的。定义变量的地方就两个。一个是类内部,一个是方法内部。下面有个总结。很关键,是理解并发编程的基础

在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。
(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中
(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。

二:在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。
同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量
(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的
(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中.

是不是很复杂。这还没加入 方法的参数。跟方法返回值呢。加入了更复杂。有个基本概念就好了。要记住的就是写代码的时候要多问自己一嘴,这个变量是在哪里,写在这里究竟是共享内存,还是栈内存。是共享内存就要考虑多线程并发问题。由此引出了 后面的并发三大特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值