# 一、内存与线程
## 1、内存结构
内存是计算机的重要部件之一,它是外存与
cpu进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存
性能的强弱影响计算机整体发挥的水平。JVM的内存结构规定Java程序在执行时内存的申请、划分、使用、回收的管理策略,通说来说JVM的内存管理指运行时数据区这一大块的管理。
![](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625287197745517.jpg)
## 2、线程运行
JVM中
一个应用是可以有多个线程并行执行,线程被一对一映射为服务所在操作系统线程,调度在可用的
cpu上执行,启动时会创建
一个操作系统线程;当该线程终止时,这个操作系统线程也会被回收。
![](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625287197383670.jpg)
在虚拟机启动运行时,会创建多个线程,数据区中有的模块是线程共享的,有的是线程私有的:
![](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625287197337979.jpg)
线程共享:元数据区、堆Heap;
线程私有:虚拟机栈、本地
方法栈、程序计数器;
单个
cpu在特定时刻只能执行
一个线程,所以多线程通过几块空
间的使用,然后不断的争抢
cpu的执行时间段。
# 二、元数据空间
**基本描述**
方法元空间(
方法区)在JVM启动的时候被创建,是被各个线程共享的内存空间,用于存放类和
方法的元数据以及常量池,比如Class和Method。
在实际的开发中,经常因为加载的类太多,进而导致内存溢出问题,这样可以对元空
间的大小进行扩展。
**与堆的关系**
![](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625287197180869.jpg)
元空间存放加载的类信息,当类被实例化时,堆中存储实例化的对象信息,并且通过对象类型数据的指针找到类。
# 三、堆空间
**基本描述**
JVM启动时创建堆区,是内存管理的核心区,通常情况下也是最大的内存空间,是被所有线程共享的,几乎所有的对象实例都要在堆中分配内存,所以这里也是
垃圾回收的重点空间。
**堆栈关系**
![](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625287198432103.jpg)
栈是JVM运行时的单位,堆是存储单位,当栈中
方法结束,相关对象失去所有引用后,不会马上被移除堆空间,要等到
垃圾收集器运行的时候。
# 最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,
一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份**[Java核心架构笔记](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**你需要阅读阅读,希望能够对你的职业发展有所帮助。
**中高级开发必知必会:**
![](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625287198722865.jpg)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。