1. jstack:占用最多资源(CPU 内存)的Java代码

https://www.cnblogs.com/chengJAVA/p/5821218.html
https://blog.csdn.net/u012448083/article/details/76855340

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码(代码行号)。

  • 第一步,先找到 java 进程ID
    • ps -ef | grep java | grep -v grep:
      • grep java 能够搜索到 java -jar xxx.jar
  • 根据进程ID,找到该进程内最耗费CPU的线程:
    • top -Hp pid
  • 将十进制的线程 ID,转换为十六进制的线程 ID

    • printf(‘%x\n’, thread_id)
  • 使用 jstack 查看该线程 ID 的堆栈信息:

    • jstack pid | grep thread_id
      • 当然还可以输出更为详尽的信息:jstack pid | grep -A 10 thread_id

2. JVM GC 堆

https://blog.csdn.net/ls5718/article/details/51777195

Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。


这里写图片描述

  • 堆大小 = 新生代 + 老年代。
  • 堆的大小可以通过参数 –Xms、-Xmx 来指定。
  • JVM 每次只会使用 Eden 和其中的一块 Survivor (from survivor/to survivor)区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。
posted on 2018-07-15 18:53  未雨愁眸  阅读(567)  评论(0编辑  收藏  举报