文章目录
前言
学习java的我们怎么都离不开虚拟机。如果你是一个工作三年以上的朋友,那么jvm的学习将会是有必要的,许多线上的问题都需要通过理解它来更好的排查。
一、java虚拟机的内存管理
首先来看下虚拟机的五大模块:类加载器,运行时数据区,垃圾回收模块,执行引擎和本地方法接口。
运行时数据区:
jdk8做了改进,舍弃了方法区(永久代),取而代之的是–原数据区、直接内存(放在本地内存中)
下面分别来看下各个模块的功能划分:
模块 | 功能划分 |
---|---|
程序计数器 | 当前线程执行的字节码行号指示器,线程私有 |
本地方法栈 | 执行native方法 ,线程私有 |
虚拟机栈 | 用于存储栈帧,每个方法执行都会创建一个栈帧用于存局部变量表、操作数栈等,线程私有 |
本地方法区 | 存放虚拟机栈执行后的方法、常量、静态变量,线程共享 |
堆 | 所有对象创建的管理,所以也分为新生代和老年代,线程共享 |
jdk8中将方法区替换成了元数据区一起来看下:
HotSpots取消了永久代,那么是不是也就没有方法区了呢?当然不是,方法区是一个规范,规范没变,它就一直在,只不过取代永久代的是元空间(Metaspace)而已。
.Q:为啥做这个改变?
A:1.原来的方法区存放的元数据、常量、静态变量大小不固定,容易造成内存溢出。
2.移除永久代是为融合HotSpot VM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代(这个蛮知道下哈哈。。。
标签:堆外,对象,虚拟机,回收,线程,内存,JVM,优化 来源: https://blog.csdn.net/weixin_54604802/article/details/118416481
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。