JAVA的JVM的内存
栈区: 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),
对象都存放在堆区中每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问(servlet线程和入库线程不能共享数据)。栈分为3个部分:基本类型变量区、执行
环境上下文、操作指令区(存放操作指令)。
java中栈可以分为参数栈 、函数调用栈。
每个线程的栈互相独立,栈是thread safe
堆区: 存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)。jvm只有一个堆区(heap)
被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。
方法区: 又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编
译后的代码等数据
方法区和持久代:
物理:java的堆内存分permantspace(持久带)和 heap space。方法区在堆的持久代里面
逻辑:方法区和堆独立
溢出:
年老代溢出:巨量字符串和对象,代码申请上百M甚至上G的内存
持久代溢出:动态加载了大量Java类
垃圾回收器
方法论-回收算法:
标记-清除算法、复制算法、标记-整理算法、分代收集算法
落地实现-垃圾回收器:
串行垃圾回收器(Serial Garbage Collector)
并行垃圾回收器(Parallel Garbage Collector)
并发标记扫描垃圾回收器(CMS Garbage Collector)
G1垃圾回收器(G1 Garbage Collector)
jdk垃圾回收和区别:
jdk1.7和1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
并行 Parallel
指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
G1和CMS都为分代收集
G1同时回收老年代和年轻代,逻辑上的概念,内存分多region,Eden/ Survivor/Old逻辑集合
CMS只能回收老年代,需要配合一个年轻代收集器
GC分代式原因:实现分代的最大好处是,GC能够应付的应用内存分配速率(allocation rate)可以得到巨大的提升。缩短GC一
次工作的时间长度,和表分区一个意思。
设计思路:weak generational hypothesis——大部分对象的生命期很短(die young),而没有die young的对象则很可能会存活很长时间(live long)。
young gen:大小配置通常只占整个GC堆的较小部分,而且较高的对象死亡率。让它非常适合使用copying算法来收集。
young GC:当young gen中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。
full GC:当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发
full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。
Minor GC和Major GC是俗称,在Hotspot JVM实现的Serial GC, Parallel GC, CMS, G1 GC中大致可以对应到某个Young GC和
Old GC算法组合
参数
项目启动脚本中-Xms2048m -Xmx2048m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m
-Xmn 新生代大小
-Xms 设置初始堆的大小,也是最小堆的大小,它等价于:-XX:InitialHeapSize
-Xmx 设置最大堆的大小,它等价于-XX:MaxHeapSize。
堆的初始值和最大值不一样的话,JVM会根据程序的运行情况,自动调整堆的大小,这可能会影响到一些效率。针对服务端程序,
一般是把堆的最小值和最大值设置为一样来避免堆扩展和收缩对性能的影响。
-Xss 设置线程栈的大小,线程栈的大小会影响到递归调用的深度,同时也会影响到能同时开启的线程数量。
-XX:PermSize 用来设置永久区的初始大小
-XX:MaxPermSize 用来设置永久区的最大值
-XX:+UseG1GC G1垃圾回收器
代码
C++中将释放了的指针置为null的习惯要保留到Java中,释放内存的途径:将不用的变量和对象置为null,让虚拟机去管理内存。
图