jvm笔记

1.jvm_java程序运行环境(Java二进制字节码的运行环境) 

  好处:一次编译,到处运行

         自动内存管理.垃圾回收机制

         数组下标越界检查

 2.常见的jvm

3.学习线路

4.内存结构

程序计数器

虚拟机栈

本地方法栈

方法区

1.1 程序计数器:记住下一条jvm指令的执行地址 特点:线程私有,没有内存溢出

 1.2虚拟机栈

栈的数据库结构:先进后出

 

 定义:每个线程运行时所需要的内存称为虚拟机栈

每个栈由多个栈帧组成,对应着每次方法调用所占用的内存.

每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法.

问题辨析:1.垃圾回收是否涉及栈内存?每一次方法调用都被会弹出栈.自动被回收,不需要垃圾回收.垃圾回收主要针对堆

               2.方法内的局部变量是线程安全的么?是  局部变量是线程私有的 如果加static变量,就是不安全的

 

栈内存溢出:递归调用的情况会导致栈内存溢出

 

 线程运行诊断

案例1cpu占用过多 

a.检测:top命令 能检测到有问题的进程编号;但是检测到具体的线程的占用情况.

 

 b.ps命令可以查看线程对cpu占用情况, ps H -eo pid(进程id), tid(线程id),%cpu  (输出的线程id是10进制的)

注:上图为查询这个进程中的那个线程cpu占用情况;

jdk提供的工具 jstack + 进程id (输出的线程id是16进制的) 定位到有问题的线程,并且能定位到具体的代码行数.

案例2程序运行很长时间没有结果(线程死锁的问题)  jstack + 进程id

 2.本地方法栈:基础类库 (object)

3.堆heap

3.1定义:通过new关键字,创建对象都会使用堆内存.

特点: 它是线程共享的,堆中的对象都要考虑线程安全的问题

有垃圾回收机制

3.2.堆内存溢出例子

 

 

 3.3堆内存诊断

 a.jps命令 获取进程id  b.jmap -heap + 进程id 

 案例:垃圾回收后,内存占用任然很高

4.方法区

4.1定义:共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

 

 

 StringTable面试题

 

 

posted @ 2020-05-09 09:26  纯洁的赤子之心  阅读(123)  评论(0)    收藏  举报