ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM 学习 (02_day)

2021-12-25 19:35:32  阅读:127  来源: 互联网

标签:02 查看 占用 System day 线程 内存 JVM CPU


一、虚拟机栈
1、栈内存溢出(Java.lang.stackOverflowError)
原因:

  • 栈帧过多导致栈内存溢出(无线递归)
  • 栈帧过大导致栈内存溢出
    2、线程运行诊断
    CPU占用过高
    Linux环境下运行某些程序的时候,可能导致CPU的占用过高,这时需要定位占用CPU过高的线程
  • top命令,查看是哪个进程占用CPU过高
  • ps H -eo pid, tid(线程id), %cpu | grep 刚才通过top查到的进程号 通过ps命令进一步查看是哪个线程占用CPU过高
  • jstack 进程id 通过查看进程中的线程的nid,刚才通过ps命令看到的tid来对比定位,注意jstack查找出的线程id是16进制的,需要转换
    二、本地方法栈
    带有native关键字的方法就是需要JAVA去调用本地的C或者C++方法,因为JAVA有时候没法直接和操作系统底层交互,所以需要用到本地方法
    三、堆(heap)
    定义:通过new关键字创建的对象都会被放在堆内存
    特点
  • 所有线程共享,堆内存中的对象都需要考虑线程安全问题
  • 有垃圾回收机制
    堆内存溢出(java.lang.OutofMemoryError :java heap space):
    堆内存诊断:
  • jps工具:查看当前系统中有哪些java进程
  • jmap工具:查看堆内存占用情况
  • jconsole工具:图形界面的,多功能的监测工具,可以连续监测
    代码演示:
点击查看代码
public class Demo_02 {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("1.....");
        Thread.sleep(30000);
        byte[] bytes = new byte[1024 * 1024 * 10];// 10M
        System.out.println("2.....");
        Thread.sleep(30000);
        bytes=null;
        System.gc();
        System.out.println("3.....");
        Thread.sleep(1000000L);
    }
}
运行程序后,开始如下操作: 1、在teminal输入jps,找到程序运行的进程号 2、输入 jmap -heap 5596

另一虚拟机内存可视化工具:jvisualvm

标签:02,查看,占用,System,day,线程,内存,JVM,CPU
来源: https://www.cnblogs.com/Ncad/p/15727405.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有