深入分析javaweb技术内幕笔记3---JVM内存管理


凌乱原文:

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时可能发生内存泄漏)


你可能感兴趣的:(jvm,内存管理,内存分配)