JVM
一、程序计数器
作用:记住下一条JVM指令的执行地址
物理实现:寄存器
特点:1、线程私有,每一个线程拥有自己的程序计数器
2、唯一一个不会存在内存溢出的寄存器
二、Java虚拟机栈
作用:线程运行需要的内存空间,由栈帧组成,栈帧就是方法运行需要的内存空间,对应着每次方法调用时的内存
栈帧:用于存储局部变量表、操作数栈、动态链接、方法出口等信息
每次线程都只能有一个活动栈帧,对应着当前正在执行的那个方法。
注意:1、垃圾回收不涉及垃圾回收
2、栈内存分配越大那么线程数越少
3、方法内的局部变量是线程安全的,且其的作用范围只能是方法内部,否则就是线程不安全的。
4、可以通过-Xss256k进行设置栈上午内存大小。
栈内存溢出(StackOverFlowError):1、栈帧过多,递归调用容易出现该种情况;2、栈帧过大,导致栈溢出。
线程运行诊断:1、cpu占用过多: 1)top命令定位进程对cop占用;2)ps H -eo pid,tid,%cpu | grep 进程id 进行线程定位; 3)jstack 进程id 查看详细信息
2、程序运行很长时间没有结果:jstack进行调优
本地方法:native
三:堆Heap
通过new关键字,创建对象都会使用堆内存,用于存储对象实例。
特点:
1、它是线程共享的,堆中对象都需要考虑线程安全的问题
2、它有了;垃圾回收机制
堆内存溢出:OutOfMemoryError
产生原因:不断创建对象,并使GC回收机制不能清除这些对象,之后就会产生异常。
虚拟机控制:-Xmx进行设置,
堆内存诊断:
jps工具:查看当前系统中有哪些Java进程
jmap工具:查看对内存占用情况 jmap -heap 进程id
jconsole工具:图形界面的,多功能监测工具,可以连续监测
案例:垃圾回收后,内存依旧占用很高 jps查看进程id;jmap -heap 进程id 查看内存详情;jconsole可视化进行查看;jvisualvm 可视化查看(特点:抓取堆的当前快照)
四、方法区
定义:所有java虚拟机线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
溢出:-XX:MaxPermSize=8m
1.8之前,永久代内存溢出:java.lang.OutOfMemoryError:PermGen space
1.8之后:元空间内存溢出:java.lang.OutOfMemoryError:Metaspace

浙公网安备 33010602011771号