JMM
2020-03-09 本文已影响0人
啊啊啊哼哼哼
这篇文章简单介绍Java内存模型:

这里从线程的角度对Java内存模型进行划分:
线程私有的:虚拟机栈(Jvm Stack), 本地方法栈(Native Method Satck), 程序计数器(PC register)
- 虚拟机栈的内部结构是栈帧,栈帧包含一个局部变量表,操作数栈,动态链接和返回地址。当递归数过深,栈帧数超过虚拟机栈深度时会引发StackOverflowError;
- 本地方法栈:和虚拟机栈功能类似,服务于本地方法的调用;
- 程序计数器:指向当前运行代码行。
线程公有的:元空间(Meta Space), 堆(Heap)
元空间
- 元空间:元空间是Java 8以后,本地方法的一种新的实现方式,并且常量池在堆中。元空间存储了类的相关信息,比如方法,字段。Java8之前,堆中的永久代是实现本地方法的方式。
- 为什么要通过元空间对Permanent Generation进行一个替换?
1、元空间利用的是本地内存,Perman Gen利用的是jvm的堆内存。
所以Perman Gen 存在一个异常:java.lang.OutOfMemoryError: PermGen Space
2、字符串常量池永久存放在永久代中,容易出现性能问题和内存溢出;
3、类和方法的信息大小难以确定,给永久代的大小指定带来问题;
4、永久代会为GC带来不必要的复杂性;
5、方便HotSpot与其他JVM如Jrockit的集成。
堆
-
java -Xms -Xss ...jar
1、-Xms指示堆分配的最小内存;
2、-Xmx指示堆分配的最大内存;
3、-Xss指示每个线程的虚拟机栈的内存。
4、在初始设置时,-Xms最好等于-Xmx,因为扩容时会引起内存抖动,影响性能。 -
堆存放数组和对象
-
堆是GC算法的主要应用对象,详细的GC算法和堆的划分下次记录。
image.png
-
ClassLoader:依据特定格式加载class文件到内存;
-
Execution Engine:对命令进行解析;
-
Native Interface:融合不同开发语言的原生库为Java所用;