最近有些迷茫,脑子里的想法很多,但是却很难落地。
“拆”,大系统可以拆成小系统,大模块可以拆成小模块,学习及想法亦可以拆。今天我们就一起来吧想法拆解一下。具体如何拆呢?——问答学习法
第一问:JAVA的内存模型简介。
那么什么是JAVA内存呢?
首先应当从java运行机制说起,java源程序通过编译为.class字节码文件。JVM通过类加载器加载字节码文件,然后执行引擎负责调度执行,运行期数据区即JAVA内存。
内存分区:堆内存、栈内存、方法区、程序计数器、本地方法栈。
分区特点:
堆内存一般存储对象实例及数组,内存设置参数最小堆内存-Xms 最大堆内存-Xmx,一般这两个参数等值。
堆内存又被划分为不同代:永久代、老年代、新生代。
堆内存GC机制:Eden - From - to - Old
内存分配过程及GC回收:
从对象创建过程说起,Object obj=new Object();
类版本信息,方法描述等信息存储在方法区(永久代),JVM加载类过多会抛出永久代溢出异常。
对象存储于堆内存,当引用不存在,可通过手动或自动GC机制得到回收。当对象创建过多或内存过小,新生代来不及回收,新生代的对象将迁移至老年代,以此类推,老年代不够使将迁移至永久代,如果永久代也不够将抛出OutOfMemoryException。
栈内存一般存储变量,具有压栈弹栈特性(先进后出)。上述的引用变量存储在栈内存中。
StackOverFlowException栈内存溢出现象,深度过深后出现。