初识JVM
一、程序计数器 记住下一条jvm指令的执行地址,解释器会去程序计数器拿jvm指令。 线程私有的,CPU会给每个线程分配时间片,时间片执行完会切换线程。 唯一不会出现内存溢出的区域。 二、虚拟机栈 线程运行需要的内存空间,每个线程都有一个栈。 由多个栈帧组成,每个方法运行需要的内存(参数、局部变量、返回值),先入后出。 每个线程只能有一个活动栈帧,就是正在执行的方法。 垃圾回收不涉及栈内存。 栈内存参数:-Xss 1024k。栈内存变大,总线程就会变少。 方法内的局部变量如果没有逃离方法的作用范围,则是线程安全的。 栈内存溢出错误:StackOverflowError 案例: (一)CPU占用过高 1、查看所有进程的cpu占用率,获取哪个进程占用cpu最高:top。 2、查看某个进程的哪个线程占用cpu最高:ps H -eo pid,tid,%cpu | grep ${pid}。 3、查看某个进程的所有线程详细信息:jstack ${pid}。 三、本地方法栈 本地方法运行使用的内存,例如object.clone(),被native修饰的。 四、堆(heap) 通过new创建的对象都会放在堆中,线程共享的,有垃圾回收机制。 内存溢出异常:java