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面试题

 
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号