JVM 详解
----------- 你的时间不多了,抓紧做你想做的
引言:
JVM 其实没有那么神秘, 其实就是运行在操作系统上,帮助我们运行程序的一个程序
一、规范
根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示
个人理解:规范只是一个约束,但是在具体的不同的java 虚拟机实现厂商细节是不一样的 , 目前我们接触到大多都是sun公司的hotSpot 虚拟机,
HotSpot 对于内存区域的具体划分没有像上面划分的这么细,它主要就划分成两个部分,一个是堆一个是栈。
知识点:
宏观来看:
方法区 + 堆: 用于存放数据的
虚拟机栈 + 本地方法栈 + 程序计数器 : 用于存放执行的逻辑的
微观来看
方法区: 用于存放类的元数据(元数据: 简单名字 + 描述信息, 例: spring.io.file + public + static, 这些描述这个类的信息的东西)
堆: 用于存放类的实例数据
字符串常量池存放在方法区中‘’‘’
局部变量表存放在栈里面
JVM 内存分配
当一个对象被创建后,他是如何在java 虚拟机中生存下来的, 他将经历哪些磨难?
官方语言:
- 对象优先在Eden 分配
- 大对象直接进行如老年代
- 长期存活下来的对象将进入老年代
- 动态对象年龄判定
- 空间分配担保
上述知识支撑: 堆主要分为: 新生代 和 老年代, 其中新生代分为 Eden + survivor1(s1) + survivor(s2),[比例 8 : 1 : 1],
新生代 和 老年代 : 一般占堆大小的 1/3 和 2/3 (这个可以通过参数进行设计)。
GC(垃圾回收主要发生在堆里面), 主要包含minorGC, fullFC
c, FullGc。 其中 minorGc 主要针对新生代, FullGc 主要针对 老年代(永久代)。
当内存不够的时候, 如法存放一个将要创建的对象的时候,就会触发相应的Gc(垃圾回收机制)。