凌乱原文:
1.在java中的类和加载类的类加载器本身同样需要存储空间,在Sun JDK 中它们也被存储在丢中,这个区域叫做永久代(PermGen区)
2.在Java的类和方法中的局部变量包含原生数据类型(int、long、char等)和对象的引用都是静态分配内存的。
3.内存的分配是在对象创建时发生的,而内存的回收是以对象不再引用为前提
4.类的Class对象:当每个类被JVM加载时都会创建一个代表这个类的数据类型的Class对象
5.内存地址空间被划分为内核空间和用户空间。(为了保证操作系统的稳定性)
运行时数据区域:
1.线程共享:方法区、堆(存储对象)
2.线程隔离:虚拟机栈(栈帧:用来保存参数、局部变量、中间计算过程和其他数据)、本地方法栈、程序计数器栈
NIO:
1.NIO使用java.nio.ByteBuffer.allocateDirect()方法分配内存
2.分配的内存使用的是本机内存而不是Java堆上的内存
3.不适合IO频繁发送很小数据的情况
JNI:
使本机代码(如C语言程序)可以调用Java方法,也就是通常所说的native memory
内存分配策略:
1.静态内存分配:在编译时就可以为它们分配固定的内存空间
2.栈式内存分配也称为动态存储分配
3.堆:当程序真正运行到相应代码时才会知道空间大小(效率低)
基于分代的垃圾收集算法:
1.Young区:分为Eden区和两个Survivor区(From、To区,两区始终有一个是空的);
Old区:Survivor区中对象足够老或是Eden区满将对象存放在Survivor区中,但Survivor区仍然存不下时直接存放在Old区。Old区满触发Full GC;
Perm区:存在主要是类的Class对象。
2.Hotspot的三种垃圾收集算法:
Serial Collector:JVM在Client模式下默认的GC方式(单线程、暂停应用程序);
Parallel Collector:(多线程、暂停应用程序)
1)ParNewGC
2)ParallelGC (Server下默认的GC方式)
3)ParallelOldGC(清除Heap中部分垃圾对象)
3.CMS Collector(使用NIO时可能发生内存泄漏)