简单理解一下JVM有那些部分组成如下:
由于本地方法栈过于简单,就是调用底层C/C++语言代码的存放的地方。
如Object里面的public native int hashCode()中有带native关键字都是属于调用底层方法,存储在本地方法栈。
本地方法栈和虚拟机栈所发挥的作用是非常相似的,它们之间的区别是虚拟机栈为虚拟机执行java方法服务,而本地方法栈是虚拟机调用Native方法的过程记录。
经过前面的虚拟机栈和程序计数器还有本地方法栈都有共同点就是私有的,而本次学习堆和方法区都是共享的。
特点:
- 堆在所有java虚拟机线程之间共享。堆是运行时数据区域为所有类实例和数组分配内存。
- 堆得生命周期与JVM进程一致。
- 堆是java虚拟机运行时数据区共享数据区最大得区域。
- “几乎”所有得对象和数组都在堆中进行分配。
- 堆时JVM GC工作重点区域。
- 堆内存不足时,将抛出OutOfMemoryError。
- 它是线程共享的,堆中对象都需要考虑线程安全的问题。
- 堆里有垃圾回收机制(堆中不在给指针指向是垃圾回收机制会自动回收)。
为什么将分为Method Area 和 Heap 两部分?- Method Area存储得是不经常变动得数据内容。基本不会发生频繁得GC工作。如类信息,方法信息,字段信息,git即时编译得代码Heap中存储的是运行时产生的数据对象,针对这些内容会频繁进行内存管理工作。
为什么将堆分为Old 和 Young 两部分? - 堆是我们JAVA运行过程中最主要的共享工作内存,JVM机制是共享内存垃圾自动管理的虚拟机…如果我们的每一次对象回收都要扫描整个堆区,将带来很大的工作量和性能损耗。
- Method Area存储得是不经常变动得数据内容。基本不会发生频繁得GC工作。如类信息,方法信息,字段信息,git即时编译得代码Heap中存储的是运行时产生的数据对象,针对这些内容会频繁进行内存管理工作。
为什么需要讲young区分为Eden,S0,S1三个区域
- 当young区的内存占用到达一定的量时,如果此时进行直接清理,带来的是空间碎片的问题…另外加上young区的对象一般都是朝生夕死,所以大部分的内容都会被清理,存活的对象就放入S0或者S1,有助于垃圾回收和清理
新生代中Eden:S0:S1的比例默认为什么是8:1:1?
- IBM公司的专门研究表明,新生代中的对象大概98%是“朝生夕死”
- 8:1:1是基于大量实验和数据收集分析统计对比之后的比较合理的比例。
对象的一辈子执行流程
堆溢出问题(就算有垃圾回收机制也会栈溢出)如下:
a经过22次方的相加hello后,当执行到第23次的时候,显示栈溢出。
因为a和list不是垃圾,垃圾回收并没有把他们标记垃圾回收导致栈溢出
JVM-java文件到运行在JVM过程
JVM-Stacks 虚拟机栈
程序计数器
方法区演化过程
新老年代垃圾回收器
JVM-三大垃圾回收算法
java-四种引用类型【强-软-弱-虚】