• JVM教程一


    定义:
    Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境)
    好处:

    • 一次编写,到处运行 自动内存管理,
    • 垃圾回收功能
    • 数组下标越界检查
    • 多态

    1、程序计数器

    Program Counter Register 程序计数器(寄存器)

    作用,

    • 是记住下一条jvm指令的执行地址
    • 特点
      •   是线程私有的
      •   不会存在内存溢出

    2、虚拟机栈

     

     Java Virtual Machine Stacks (Java 虚拟机栈)

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

    问题思考?

    2.1、垃圾回收是否涉及栈内存?

    • 不会,栈帧方法执行完毕只有,会自动弹出栈;

    2.2、栈内存划分越大越好吗?

    • 不是,栈内存分配越大,线程数就变少了,因为物理内存是固定的

    2.3、方法内的局部变量是线程安全的吗?

    • 1、如果方法内的局部变量作用范围没有逃离方法的作用范围,他就是线程安全的;

    • 2、如果局部变量引用了对象,并逃离方法的作用方法,就可能存在线程安全问题;

    2.4 线程运行诊断

    案例1: cpu 占用过多
    定位

    • 用top定位哪个进程对cpu的占用过高
    • ps H -eo pid,tid,%cpu | grep 进程id (用ps命令进一步定位是哪个线程引起的cpu占用过高)
    • jstack 进程id 可以根据线程id 找到有问题的线程,进一步定位到问题代码的源码行

     3、本地方法栈

    一些native方法

    4、堆

    4.1 定义

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

    4.2 堆内存诊断

    • 1. jps 工具 查看当前系统中有哪些 java 进程
    • 2. jmap 工具 查看堆内存占用情况 jmap - heap 进程id(对于jdk8之后的版本,不能再使用jmap -heap pid的命令了,需要使用命令: jhsdb jmap --heap --pid 进程id)
    • 3. jconsole 工具 图形界面的,多功能的监测工具,可以连续监测
  • 相关阅读:
    分布式事务框架seata入门
    生活==不易
    LR Socket接收超时TPS上不去解决方法
    Loadrunner拼装(并发用户)唯一值方法
    shell/Python复制文件和文件夹
    redis可以设置过期key回调实现延时队列
    计算机USB读写权限统一管理(在域环境中)
    微软Win10最新BUG_2021年9月15日_KB5005565更新之后打印机突然连接不上 或 不能打印0x0000011b(附解决方案)!
    SQLServer中update没带where的回滚操作(Update或者Delete误操作恢复方法)
    107.如何用Windows Defender全盘扫描
  • 原文地址:https://www.cnblogs.com/skyfreedom/p/16169569.html
Copyright © 2020-2023  润新知