1.物理内存和虚拟内存1.1.物理内存指的是RAM(随机存储器)1.2.寄存器也是一个存储单元,用来存储计算单元执行指令的中间结果1.3.地址总线是用来连接处理器和RAM或者连接处理器和寄存器的1.4.访问内存的方式:大多数情况下,调用操作系统提供的接口1.5.操作系统管理内存的申请空间是按照进程来管理的(互相不会访问)1.6.虚拟内存是在随着程序越来越多和设计的多任务性,物理内存无法满足程序需求的情况下出现的1.7.虚拟内存的出现使得多个进程之间可以共享物理内存.共享指的是空间上的共享,逻辑上还是不能够互相访问2.内核空间与用户空间2.1.地址空间划分为内核空间(操作系统的空间)和用户空间(程序调用者的空间),内存的使用形式2.2.内核空间主要是指操作系统运行时所使用的用于程序调度、虚拟内存的使用或者连接硬件资源等的程序逻辑2.3.网络传输的数据先是从内核空间收到远程主机的数据,然后再将内核空间的数据复制到用户空间3.在Java中哪些组件需要使用内存3.1.Java堆:用于存储Java对象的内存区域,堆的大小在JVM启动时就一次向操作系统申请完成,就此大小固定3.2.线程:每个线程创建时JVM都会为它创建一个堆栈3.3.类和类加载器:JVM只会加载程序中用到的类,木有用到的类是不会调用的3.4.类被卸载的条件3.4.1.在Java堆中没有对表示该类加载器的java.lang.ClassLoader对象的引用3.4.2.Java堆没有对表示类加载加载的类的任何java.lang.Class对象的引用3.4.3.在Java堆中该类加载器加载的任何类的所有对象都不再存活3.5.任何系统类或通过应用程序类加载器加载的任何应用程序类都不能在运行时释放3.6.I/0(NIO)分配的内存是本地内存而不是Java堆上的内存,避免了在Java堆与本机堆之间复制数据3.7.JNI4.JVM内存结构4.1.JVM是按照运行时数据的存储结构来划分内存结构的4.2.在Java虚拟机规范中将Java运行时数据划分为6种4.2.1.PC寄存器数据:保存当前正常执行的程序的内存地址,记录下哪个线程当前执行到哪条指令4.2.2.Java栈:每创建一个线程就会有一个对应的栈,每调用线程中的一个方法,就会有一个对应的栈帧(POP出栈帧的元素作为方法的返回值)4.2.3.堆:存储Java对象的地方,被所有Java线程所共享4.2.4.方法区:存储类结构信息的地方,属于Java堆中的永久区,被所有Java线程所共享4.2.5.本地方法区4.2.6.运行时常量池:属于方法区的一部分4.2.7.本地方法栈:为JVM运行Native方法准备的空间,俗称C栈5.JVM内存分配策略5.1.静态内存分配:在程序编译时就能确定每个数据在运行时所需要的空间大小,所以在编译时就可以给它们分配固定的内存地址,例如:static String n5.2.栈内存分配(动态内存分配):由一个类似于堆栈的运行栈来实现的,运行时才知道数据所需内存空间大小.但是规定在进入程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存5.3.堆内存分配:当程序真正运行到相应代码时才会知道空间大小5.4.栈中主要存放一些基本类型的变量数据,存取速度比堆要快,仅次于寄存器.缺点是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性5.5.每个Java应用都唯一对应一个JVM实例,每个实例唯一对应一个堆5.6.所有对象的存储空间都是在堆中分配的,对象的引用是在堆栈中分配的5.7.堆的优势是可以动态地分配大小,缺点是在运行时分配内存,存取速度较慢5.8.new对象的时候,并不会直接将对象的引用给本地变量,而是调用这个类的构造方法初始化这个类,将复制一份后,再赋值给本地变量5.9.堆用来存放对象,栈用来存放执行程序5.10.动态分配内存前,需要确定内存大小(在编译时完成)6.JVM内存回收策略6.1.显示的内存申请有两种:静态内存分配,动态内存分配6.2.如何检测垃圾6.2.1.正确地检测出垃圾对象6.2.2.能够释放垃圾对象占用的内存空间6.3.活动对象指的是能够被一个根对象集合到达的对象,非活动对象可以被垃圾收集器回收6.4.基于分代的垃圾收集算法:对象按照寿命长短来分组,分为年轻代和年老代6.5.垃圾收集算法6.5.1.Serial Collector(单线程)6.5.2.Parallel Collector(多线程)6.5.3.CMS CollectorRemark:1.在Java中,分配内存和内存回收都是由JVM自动完成的