-
java单线程占用内存_Java 内存空间占用规则分析
2021-03-05 11:58:52这样的问题在c或c++里使用sizeof()方法就可以得到明确答案,在java里好像没有这样的方法(java一样可以实现),不过通过jmap工具倒是可以查看出一个对象的占用内存的大小,这里介绍一种通过分析java代码计算内存使用...一个对象实例占用了多少字节,消耗了多少内存?这样的问题在c或c++里使用sizeof()方法就可以得到明确答案,在java里好像没有这样的方法(java一样可以实现),不过通过jmap工具倒是可以查看出一个对象的占用内存的大小,这里介绍一种通过分析java代码计算内存使用情况的方法。
注意,一下讨论的情况都是基于32位机,不适用用64位机,JVM是sun的HotSpot,不同的虚拟机实现可能会不同
规则一:每个对象被按照8bytes粒度对齐(数组除外)
在jvm中每个对象(数组除外)都有一个头,这个头有两个字,第一个字存储的时对象的一些标志位信息,例如:锁标志位、经历了几次gc等信息,第二个字是一个引用,指向了这个类的类信息。这里jvm给这两个字留了8个字节的空间(这个为啥用8个字节空间不是很清楚,一个字即两个字节,我一直认为4个字节就够了)
按规则一:new Object();这个Object实例就占用了8个字节
规则二:为类属性分配存储空间时不是按照类中定义的属性顺序,而是按如下的顺序:
1、double\long;----8bytes
2、int\float;----4bytes
3、char\short;----2bytes
4、boolean\byte;----1bytes
5、reference;----4bytes
例如:
Java代码
public class A {
byte a;
char b;
int c;
long d;
Object e;
}
属性 需要字节数 累积字节数
header 8bytes 8
long:d 8bytes 16
int:c 4bytes 20
char:b 2bytes 22
byte:a 1bytes 23
Object:e 4bytes 27
padding 5bytes 32
最后一行padding 5bytes的目的是,规则一中描述每个对象按照8个字节的粒度对齐,这样下一个分配的对象的开始位置必须在8的倍数上,而离27最近的8的倍数是32,因此加了5bytes。A占用32bytes
可以用jmap看一下这个计算是否准确
规则三:对于继承时,要按照规则二先计算父类的类属性占用情况,再按照规则二计算子类的类属性占用情况,不能将父类和子类的属性混合在一起按规则二分配。
例如:
Java代码
class B{
long a;
int b;
int c;
}
class BB extends B{
long d;
}
属性 占用字节数 累计字节数
header 8 8
a 8 16
b 4 20
c 4 24
d 8 32
这里累计字节正好是8的倍数,满足规则一,因此不用padding字节。BB对象内存占用了32bytes
规则四:父类的最后一个属性和子类第一个属性必须按4个字节的倍数对齐
例如:
Java代码
class B{
long a;
int b;
char c;
}
class BB extends B{
long d;
}
属性 占用的字节 累计字节
head 8 8
a 8 16
c 2 18
padding 2 20
d 8 28
padding 4 32
第一次padding2是因为属性c分配内存后,不满足父类最后一个属性和子类第一个属性按4字节粒度对齐(18除4除不开),因此需要添加两个字节使其可以按4字节粒度对齐。
第二次paadding4是依据规则一
规则五:当子类的第一个属性是double或long,但是父类不能按8字节粒度对齐时,子类内存分配时的顺序将不按规则二进行,而是按:先int\float、char\short、boolean\byte、reference、long\double
例如:
Java代码
class A{
byte a;
}
class B extends A{
long b;
short c;
byte d;
}
属性 占用字节数 累计占用字节数
head 8 8
a 1 9
padding 3 12
c 2 14
d 1 15
padding 1 16
b 8 24
第一次 padding 3是根据规则四
第二次 padding 1是因为b属性是8个字节,因此需要按8个字节粒度对齐。B占用24bytes
对于数组,与普通对象不同的是在头部,头部多了4个字节用于存储长度信息。因此数组的head是12bytes而不是8bytes
-
java线程占用cpu或者内存高的代码
2021-02-25 16:59:37分析java线程占用cpu或者内存高的代码 1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从大到小排序,大写M以内存大小排序】 2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程...分析java线程占用cpu或者内存高的代码
1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从大到小排序,大写M以内存大小排序】2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程106854这个进程id
3、通过命令top -Hp PID 例如top -Hp 106854
就可以列出该进程下的所有线程id4、通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的
然后找到109391这个线程id
5、使用命令printf “%x\n” 109391 输出对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码
6、使用命令jstack PID|grep 1ab4f 【备注PID是进程的id,1ab4f是这个进程下的一个线程占用最高的cpu十六进制码】
7、通过上面的输出发现kafka,所以会联想到,kafka一直监听消息,所以消耗cpu,正常现象
8、如果出现自己写的类,说明需要修改代码逻辑了
-
查看java进程占用内存_java进程占用系统内存高,排查解决
2021-02-12 22:13:20然后开始定位问题原因,因为阿里这边安全的原因,具体的图片就不方便上传了,拿网上的图来说使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2....故障:今天许多开发反馈测试平台卡,访问不了,第一感觉判断是服务器内存爆了,或者cpu占用过高,上服务器看了一下,确实是内存爆了。然后开始定位问题原因,因为阿里这边安全的原因,具体的图片就不方便上传了,拿网上的图来说
使用top命令查看系统资源的使用情况,命令:top
如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+
2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd
由此可以看到这PID:9718的进程产生了很多线程。接下来就可以通过jstack查看内存使用的堆栈。
3. 查看内存使用的堆栈:在这里我们挑选了TID=9731的线程进行分析,首先需要将9731这个id转换为16进制。需输入如下命令,
printf "%x\n" 9731
接下需要使用16进制的2603
4. 将PID为9718的堆栈信息打印到jstack.log中,命令:jstack -l 9718 > jstack.log
5. 查看堆栈信息文件,命令:vim jstack.log
在进行搜索TID为2603的相关信息。如图:
可以看到这个线程状态为:WAITING。通过查看文件分析 看到大量 Java Thread State。
说明它在等待另一个条件的发生,来把自己唤醒,或者干脆它是调用了 sleep(N)。
此时线程状态大致为以下几种:
java.lang.Thread.State: WAITING (parking):一直等那个条件发生;
java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。
6.代码优化:将文件发送给开发。优化下线程
这里还有一种排查思路
在定位到具体的PID后,可以到处进程快照,看看这个线程做了啥
jstack -l 9718 > ./9718.stack
再用grep查看下线程在文件里做了啥
cat 9718.stack |grep '2603' -C 8
这里随便定位一个,基本上这样查都可以定位到线程的问题
-
分析java线程占用cpu或者内存高的代码
2019-11-13 18:41:04分析java线程占用cpu或者内存高的代码 1、通过top查看占用cpu或者内存高的进程(然后按下大写P会以cpu从大到小排序,大写M以内存大小排序) 2、通过对应的cpu找到PID也就是进程对应的pid,例如pid=19485 3、通过...分析java线程占用cpu或者内存高的代码
1、通过top查看占用cpu或者内存高的进程(然后按下大写P会以cpu从大到小排序,大写M以内存大小排序)2、通过对应的cpu找到PID也就是进程对应的pid,例如pid=19485
3、通过命令top -Hp PID 例如top -Hp 19485就可以列出该进程下的所有线程id
4、通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的,然后找到19530这个线程id
5、使用命令printf “%x\n” 19530输出线程id对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码
6、使用命令jstack PID|grep 4c4a【jstack 19485|grep 4c4a 备注PID是进程的id,4c4a是这个进程下的一个占用最高cpu的线程id对应的十六进制码】
7、通过上面的输出找出对应的消耗CPU的代码。jstack 19485|grep 4c4a
-
java 查看线程占用的cpu和内存使用率
2015-12-23 19:52:01在JDK的bin目录有一个工具,叫jconsole.exe,双击打开后,连接你需要监控的JVM,然后就可以来查看CPU、内存占用情况。 还有JDK提供的 jvisualvm.exe,功能更强大。... -
定位Java进程中线程资源占用内存情况之三部曲
2019-11-21 21:25:14如何准确定位Java进程中哪些线程资源占用内存高的问题第一步 通过top查看具体是哪个进程占用内存较多第二步 定位具体进程中哪些线程占用内存第三步 打印进程的堆栈信息到log中 第一步 通过top查看具体是哪个进程占用... -
java进程占用内存_java进程占用系统内存高,排查解决
2021-02-27 13:07:27使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,... -
java mysql被占用内存_Java进程占用内存过高,排查解决方法
2021-01-19 09:31:54如下图:解决方法:A:可能是代码原因导致的问题:1、使用命令:top查看当前进程的状态2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 916 -... -
查看 java进程占用系统内存高
2019-12-06 12:00:17使用 命令 ps -ef | grep Java名目名字 使用top命令查看系统资源的使用情况,命令:top ...定位线程问题(通过命令查看15960进程的线程情况),命令:ps p 15960 -L -o pcpu,pmem,pid,tid,time,tname,cmd ... -
【JAVA】Java进程占用内存过高
2020-06-09 09:17:092、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:#ps p 916 -L -o pcpu,pmem,pid,tid,time,tname,cmd 由此可以看到这PID:916的进程产生了很... -
使用jstack排查java应用占用内存过高问题
2021-04-21 14:00:42使用jstack排查java应用占用内存过高问题记录 1.使用top命令查看内存使用最高的应用 使用大写M可按照内存使用排序,大写P可按cpu使用排序; 可以看到第一个java应用占用的cpu和内存明显高于其他几个; 2.定位线程... -
java应用占用内存高的排查
2021-03-14 19:01:12场景:生产环境运行了一个java tomcat web应用,之前没有去观察他的资源使用情况,今天在查看日志时看了一下应用的内存,发现内存占用很高(这里说明一下,这个应用没有什么人访问,理论上来说是不会占用太多内存的... -
java内存过高排查_java应用占用内存过高排查的解决方案
2021-03-22 20:36:05查看使用dstat和top查看内存使用最高的应用使用dstat查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况使用top可以看到java应用整体内存使用率超过了70... -
java内存使用情况分析_java应用占用内存过高排查的解决方案
2021-03-18 12:43:35查看使用dstat和top查看内存使用最高的应用使用dstat查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况使用top可以看到java应用整体内存使用率超过了70... -
Java进程占用内存过高,排查解决方法
2019-05-23 17:37:00最近收到邮件报警,说内存使作率...2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 916 -L -o pcpu,pmem,pid,tid,time,tname,cmd ... -
was进程内存占用过大_Java进程占用内存过高,排查解决方法
2020-12-21 15:45:57如下图:解决方法:A:可能是代码原因导致的问题:1、使用命令:top查看当前进程的状态2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 916 -... -
彻底解决Java进程占用内存过高的问题
2020-07-30 11:38:37查询各进程占用内存情况:ps aux | awk '{print $6/1024/1024 " GB\t\t" $2,$11}' |grep java|grep -v grep | sort -n 解决方法: A:可能是代码原因导致的问题: 1、使用命令:top查看当前进程的状态 2、从... -
win7 java如何 查看内存占用_java获取JVM的CPU占用率、内存占用率、线程数及服务器的网口吞吐率、磁盘读写...
2021-03-15 00:10:50import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.LineNumberReader;import java.lang.management.ManagementFactory;impor... -
java多线程-cpu内存占用-定位分析
2016-03-08 13:16:23一,创建测试环境(windows) 二,定位 正文: 测试环境如下: 建立2个线程类,一个run死循环执行大量io,另一个run死循环执行1...可看出,java进程里2个线程高占用cpu。 现在大概定位问题了,如果对程序很熟悉 -
java 进程内存_java进程占用系统内存高,排查解决
2021-02-12 14:13:57使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,... -
在linux服务器上,排查占用cpu中的java线程线程
2018-03-20 17:59:37出现的问题截图: 问题排查 **查看cpu **查看对cpu影响大的10个进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head ?...**查看活着的线程,查看占用cpu高的Java线程 ./jmap -histo:live 19534 ... -
找到占用CPU最高的Java线程
2018-03-20 21:41:00二、找到内存和CPU占用最高的线程pid 1,使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如123 2,按H,获取每个线程的内存情况 3,找到内存和cpu占用最高的线程pid,比如15248 4... -
Java线程cpu占用高的定位思路
2019-09-21 15:58:241.使用top -H -p命令查看进程里边的多个线程的cpu使用情况,一般都是看使用最高的前三个线程,记录对应的进程号 2.通过jstack导出进程堆栈信息,然后在堆栈信息里边搜索top查出来的线程号(转换为16进制),找到对应的... -
java 内存使用过高_java进程占用系统内存高,排查解决
2021-02-27 18:54:31使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,... -
was进程内存占用过大_java进程占用系统内存高,排查解决
2020-12-21 15:45:56使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,... -
eclipse占用内存过大_java程序内存分析
2020-11-30 00:44:14首先通过jstack命令查看java进程中各个线程的栈信息jstack 3203 >1.txt 导出到1.txt文件待用2.首先通过top -H -p pid 分析出java进程中占用cpu高的线程号top -H -p 32033.获取到占用cpu高的线... -
Linux服务器java进程占用系统内存高
2019-01-04 09:26:49如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+ 2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd 由此可以看到这PID... -
查找Java程序中占用CPU线程
2019-08-10 19:11:21今天发现有个java应用占用CPU一直很高,将查看哪个线程导致CPU占用率高的方法总结如下: 查看进程PID 使用top、ps等命令都可以,这里使用top: 可以看到PID=7679和PID=7745的进程占用CPU都很高。 通过top -Hp PID...