JVM内存结构

匿名 (未验证) 提交于 2019-12-02 23:42:01

Java

:OSGI

混合语言JVMgoogleKotlin Android Scala(Kafka)

多核并行CPUJDK1.7Fork/JoinJDK1.8lambda()

丰富语法:JDK5()JDK7try-catch-finally try-with-resource

6464326432JVM4G

CMSG1JDK11 ZGC10TBJDK12JDK13(20199)4TB16TB

Java SE

JavaSEJavaJava EEJava ME

JDKJavaJDKJREJRE

JREJava SEJavaJava

JVMjavaJavaSE

运行时数据区域

JVMC++

=+

----java------

Java

线程私有

程序计数器

较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响(面试可能问到为什么需要)

Java

NatvieUndefined

OutOfMemoryError

JVM

iload_1

第二个int

bipush

将一个byte

isub

栈顶两int型数值相减,并且结果进栈

istore_1

将栈顶int型数值存入第二个局部变量

栈:

javaJVMStackFilo

虚拟机栈:

异常:

StackOverflowError

JVMOutOfMemoryError

虚拟机栈:

每个线程私有的,线程在运行时,在执行每个方法的时候都会打包成一个栈帧,存储了局部变量表,操作数栈,动态链接,方法出口等信息,然后放入栈。每个时刻正在执行的当前方法就是虚拟机栈顶的栈桢。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程。

1MXss-Xss256k

Code

:顾名思义就是局部变量的表32Java3264ObjectreturnAddress

操作数据栈:存放我们方法执行的操作数的,java/

动态连接:Java

返回地址:

正常返回(调用程序计数器中的地址作为返回)

三步曲:

恢复上层方法的局部变量表和操作数栈、

把返回值(如果有的话)压入调用者栈帧的操作数栈中、

PC

<>

本地方法栈

nativeJNIC/C++(c/c++)

线程共享的区域

类信息:

、、publicprivate...、、、、(interfacejava.lang.Object)

/

("zdy","123")(static)

jdk1.7-XX:PermSize;-XX:MaxPermSize;

jdk1.8

jdk1.8

如:-XX:MaxMetaspaceSize=3M

几乎所有对象都分配在这里,也是垃圾回收发生的主要区域,可用以下参数调整:

-Xms:堆的最小值;

-Xmx:堆的最大值;

-Xmn:;

-XX:NewSize;;

-XX:MaxNewSize:;

例如- Xmx256m

运行时常量池

javaPeopleclassPeopleToolPeople

PeopleToolorg.simple.ToolTool

.

String a = "abc",abc

int a = 1; 1

final

常量池的变化

各版本之间的变化

直接内存

Native(NIO)

JVM(-XX:MaxDirectMemorySize,OOM)

Java Native

测试用例JavaStackJVM-Xmx100m-XX:MaxDirectMemorySize-Xmx128M

站在线程角度来看

虚拟机栈、本地方法栈、程序计数器。

线程共享区域:就复杂多了,后续完善

深入辨析堆和栈

功能

  • 以栈帧的方式存储方法调用的过程,并存储方法调用过程中基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放;
  • 而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中;

线程独享还是共享

  • 栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
  • 堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。

空间大小

栈的内存要远远小于堆内存

栈溢出

-Xss256k

()

OutOfMemoryError

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!