JVM虚拟机内存结构笔记 上

内存结构

1.程序计数器
    Program Counter Register 程序计数器(寄存器)
    二进制字节码->解释器->机器码->CPU
    程序计数器的作用是记住下一条JVM指令的执行地址
    特点:
    ·是线程私有的
    ·不会存在内存溢出

2.虚拟机栈
    栈-线程运行需要的内存空间
    栈帧-每个方法运行时需要的内存
    Java Virtual Machine Stacks(Java虚拟机栈)
    ·每个线程运行时所需要的内存,称为虚拟机栈
    ·每个栈由多个栈帧(Frame)组成,对应着每次方法调用所占用的内存
    ·每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

    问题辨析
    1.问题内存是否涉及栈内存?不涉及,栈内存执行完毕会自动弹出释放
    2.栈内存分配越大越好吗?并不是,会让线程数变少
    3.方法内的局部变量是否线程安全?如为静态变量则存在,线程私有变量则不涉及
    ·如果方法内局部变量没有逃离方法的作用范围,它是线程安全的
    ·如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全

2.2栈内存溢出
    *栈帧过多会导致内存溢出
        递归最容易导致栈帧过多,StackOverflowError
    *栈帧过大会导致内存溢出
        不容易复现

2.3线程运行诊断
    案例1:cpu占用过多
        定位
        ·用top定位那个进程对cpu的占用过高
        ·ps H -eo pid,tid,%cpu | grep 进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高)
        ·jstack进程id 可以根据线程id找到有问题的线程,进一步定位到问题代码的源代码行
    案例2:程序运行很长时间没有结果    
        
3.本地方法栈
    Native Method Stacks 即使用计算机底层的其他语言使用的方法使用的内存空间

4.堆
    Heap堆
    ·通过new关键字,创建对象都会使用堆内存
    特点
    ·它是线程共享的,堆中对象都需要考虑线程安全的问题
    ·有垃圾回收机制

4.2 堆内存溢出
    OutOfMemoryError -Xmx堆空间参数

4.3 堆内存诊断
    1.jps工具
        ·查看当前系统中有哪些java进程
    2.jmap工具
        ·查看堆内存占用情况
    3.jcomsole工具
        ·图形界面的,多功能的监测工具,可以连续监测

    案例
    ·垃圾回收后,占用仍然很高 jvirsualvm工具

5.方法区 Method Area

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值