一、jdk、jre、jvm的关系
jdk、jre、jvm之间的关系:https://blog.csdn.net/weixin_43878966/article/details/102574048
jre = jvm+类库
二、JVM内存区域
虚拟机栈:在JVM运行过程中存储当前线程运行方法所需的数据、指令、返回地址。缺省大小为1M,参数-Xss。在java方法被调用的时候,会创建一个栈帧,进行入栈和出栈,栈帧包括:局部变量表、操作数栈、动态连接、返回地址。
程序计数器:当前线程执行的字节码行号指示器,如果遇到本地方法(native方法),就不需要记录了,是一块很小的内存空间,也是JVM中唯一不会OOM的内存区域。
本地方法栈:本地方法栈用于管理本地方法的调用,服务对象是native方法。
方法区:JDK1.7称为永久代,JDK1.8及以后使用元空间来实现方法区,它存储了每一个类的结构信息,如运行时常量池(是每一个类或接口的常量池的运行时表示形式),字段和方法数据,构造函数和普通方法的字节码内容,还包括一些类、实例、接口初始化时用到的特殊方法。
堆:堆是JVM上最大的内存区域,存储java对象,而对象的引用存在虚拟机栈的局部变量表中,在方法体内声明了对象并且不会逃逸出方法,它就会在栈上分配,其他情况在堆上分配,参数-Xms。
直接内存:也叫堆外内存,操作系统分配JVM内存之后剩余的内存就是堆外内存,不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,在java堆内可以用directByteBuffer 对象直接引用并操作,参数-XX:MaxDirectMemorySize。
==================================================================================================
JVM参数官方文档(JDK1.8):https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
jdk1.7hashmap死循环:https://blog.csdn.net/maohoo/article/details/81531925