1.Java管理内存可分为两大类:线程共享内存和线程私有内存
2.线程共享内存:
(1).方法区:存储jvm加载的class文件/常量/静态变量/即时编译器编译后的代码.
(2).java堆:存储java的所有实例对象/数组等
3.线程私有内存:
(1).程序的计数器:每个线程都有自己的计数寄存器,存储当前线程执行字节码的地址.
(2).jvm栈:jvm会为每个运行线程分配一个栈区,线程调用方法时和方法返回时会进行进栈和出栈操作.
(3).本地方法区:与JVM STACK 类似,只不过此区域是为调用本地方法服务.
4.查看启动该进程时使用的一些选项
jinfo -flags pid
jinfo -h
jstat -h 打印JVM的状态信息
jstat -gc PID:当前进程的垃圾回收器管理的相关数据
jstat -gc PID 1S:当前进程的垃圾回收器管理的相关数据,每1秒显示一次
jstat -gc PID 1S 5:当前进程的垃圾回收器管理的相关数据,每1秒显示一次,显示5次
S0C: 第一存活区已使用
S1C: 第二存活区已使用
S0U: 第一存活区未使用
S1U: 第二存活区未使用
EC: Eden区已使用
EU: Eden未使用
OC: 老年代区已使用
OU: 老年代区未使用
PC: 持久代区已使用
PU: 持久代区未使用
jps
java性能查看工具:jconsole,visualvm,jprofiler,janalyer
5.JVM内存分区
(1).新生代(往往刚刚新创建的对象) yong generation
a. to (幸存区 ) –> 会进入old
b. from (幸存区 ) –> 会进入to
c. eden (刚刚新创建的对象) –> 会进入from
(2).老年代 old generation
(3).持久代(创建以后不会被回收) permanent generation
6.JVM相关参数
-Xms:堆内存初始化大小(基本上等于新生代+老年代内存大小)
-Xmx:堆内存最大值
-XX:NewSize 新生代初始化值
-XX:MaxNewSize 新生代运行的最大值
新生代预留空间=新生代运行的最大值-新生代初始化值
-XX:PermSize:持久代初始化值
-XX:MaxPermSize:持久代最大值
-XX:SurviviorRatio:eden与存活区的比例
-XX:MaxHeapFreeRatio:最大堆内存的空闲比例
-XX:MinHeapFreeRatio:最小堆内存的空闲比例