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