热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JVM虚拟机小结1

1jps-l列出详细的类名和进程ID2)jps-m显示运行的程序接收的参数3)jps-v查看接收的JVM方面的参数4)jps先查出进程ID
1 jps -l //列出详细的类名和进程ID



2)jps -m // 显示运行的程序接收的参数



3)jps -v //查看接收的JVM方面的参数



4)jps 先查出进程ID后

jstat -gcutil pid 1000 10 //每隔离1000毫秒打印,搞10次





jstaat -gcnew pid //显示新生代情况



D:\PSTools>jstat -gcnew 5328

S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT

62976.0 58368.0 0.0 42323.6 14 15 62976.0 199168.0 106984.4 177 5.470





显示列名



具体描述



S0C



年轻代中第一个survivor(幸存区)的容量 (字节)



S1C



年轻代中第二个survivor(幸存区)的容量 (字节)



S0U



年轻代中第一个survivor(幸存区)目前已使用空间 (字节)



S1U



年轻代中第二个survivor(幸存区)目前已使用空间 (字节)



EC



年轻代中Eden(伊甸园)的容量 (字节)



EU



年轻代中Eden(伊甸园)目前已使用空间 (字节)



OC



Old代的容量 (字节)



OU



Old代目前已使用空间 (字节)



PC



Perm(持久代)的容量 (字节)

------------------------------------------------------



jstat -gcutil :统计gc信息



其中:



S0



年轻代中第一个survivor(幸存区)已使用的占当前容量百分比



S1



年轻代中第二个survivor(幸存区)已使用的占当前容量百分比



E



年轻代中Eden(伊甸园)已使用的占当前容量百分比



O



old代已使用的占当前容量百分比



P



perm代已使用的占当前容量百分比



YGC



从应用程序启动到采样时年轻代中gc次数



YGCT



从应用程序启动到采样时年轻代中gc所用时间(s)



FGC



从应用程序启动到采样时old代(全gc)gc次数



FGCT



从应用程序启动到采样时old代(全gc)gc所用时间(s)



GCT



从应用程序启动到采样时gc用的总时间(s)





-------------



jstat -gccapacity :可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小





显示列名



具体描述



NGCMN



年轻代(young)中初始化(最小)的大小(字节)



NGCMX



年轻代(young)的最大容量 (字节)



NGC



年轻代(young)中当前的容量 (字节)



S0C



年轻代中第一个survivor(幸存区)的容量 (字节)



S1C



年轻代中第二个survivor(幸存区)的容量 (字节)



EC



年轻代中Eden(伊甸园)的容量 (字节)



OGCMN



old代中初始化(最小)的大小 (字节)



OGCMX



old代的最大容量(字节)



OGC



old代当前新生成的容量 (字节)



OC



Old代的容量 (字节)



PGCMN



perm代中初始化(最小)的大小 (字节)



PGCMX



perm代的最大容量 (字节)



PGC



perm代当前新生成的容量 (字节)



PC



Perm(持久代)的容量 (字节)



YGC



从应用程序启动到采样时年轻代中gc次数



FGC



从应用程序启动到采样时old代(全gc)gc次数



---------------------------------------

jstat -gcoldcapacity : old代对象的信息及其占用量





显示列名



具体描述



OGCMN



old代中初始化(最小)的大小 (字节)



OGCMX



old代的最大容量(字节)



OGC



old代当前新生成的容量 (字节)



OC



Old代的容量 (字节)



YGC



从应用程序启动到采样时年轻代中gc次数



FGC



从应用程序启动到采样时old代(全gc)gc次数



FGCT



从应用程序启动到采样时old代(全gc)gc所用时间(s)



GCT



从应用程序启动到采样时gc用的总时间(s)





5)jinfo opiton pid

jinfo -flag pid //查看某个进程用的GC,比如

、jinfo -flg UseSericGC PID





在JDK bundle中隐藏着一个精悍的小工具——jinfo。作为一个命令行工具,jinfo用于收集正在运行的Java进程的配置信息。jinfo吸引眼球的地方在于,它能通过-flag选项动态修改指定的Java进程中的某些JVM flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:



my-precious me$ java -XX:+PrintFlagsFinal -version|grep manageable

intx CMSAbortablePrecleanWaitMillis = 100 {manageable}

intx CMSWaitDuration = 2000 {manageable}

bool HeapDumpAfterFullGC = false {manageable}

bool HeapDumpBeforeFullGC = false {manageable}

bool HeapDumpOnOutOfMemoryError = false {manageable}

... cut for brevity ...

bool PrintGC = false {manageable}

bool PrintGCDateStamps = false {manageable}

bool PrintGCDetails = false {manageable}

bool PrintGCTimeStamps = false {manageable}

通过选项-XX:+PrintFlagsFinal可以列出所有的JVM flag,而其中的标注为manageable 的flag则是值得我们关注的部分。这些flag可通过JDK management interface(-XX:+PrintFlagsFinal)动态修改。虽然在JConsole中也能查到与其十分相似的MBean。但在我看来,以命令行的方式查看它们更加的便捷。



如何使用jinfo

让我们通过实战来学习如何使用jinfo。在下面的例子中,我们将在一个正在运行的JVM中动态开启GC日志功能:



my-precious me$ jps

12278 HighAllocationRate

12279 Jps

12269 JConsole

my-precious me$ jinfo -flag +PrintGCDetails 12278

my-precious me$ jinfo -flag +PrintGC 12278

my-precious me$

在jinfo中需要打开-XX:+PrintGC和 -XX:+PrintGCDetails两个选项才能开启GC日志,这与用命令行参数的方式实现有着细微的差别——如果你通过启动脚本(startup script)来设置参数,仅需-XX:+PrintGCDetails即可,因为-XX:+PrintGC会被自动打开。



不过,从standard output的结果来看,PID为12278的进程的GC日志的确能够滚动地显示出来:



...

[GC (Allocation Failure) [PSYoungGen: 876416K->102624K(909312K)] 1094420K->320820K(1161216K), 0.2173131 secs] [Times: user=0.74 sys=0.00, real=0.22 secs]

...

[GC (Allocation Failure) [PSYoungGen: 890304K->102240K(917504K)] 1108924K->320956K(1169408K), 0.2446639 secs] [Times: user=0.82 sys=0.01, real=0.25 secs]

...

同理,若想关闭GC日志功能,只需要执行jinfo -flag -PrintGCDetails 12278和 jinfo -flag -PrintGC 12278命令即可。





6)jmap -dump:format=b,file=c:\aaa.bin pid

dump 出内存相关再用eclipse mat去分析;





如果结果是+号,标识有用,否则无用



7)jhat对 JMAP DUMP出来的BIN文件进行分析

jhat d:\xxxx.bin



完了后用http://localhost:7000/ 查询



8)jstack -F //强制打印

jstack -m //打印JAVA和本地方法栈

jstack -l pid //打印包含锁的信息





9) -XX:+PrintClassHistogram

按下Ctrl+Break后,打印类的信息:

num #instances #bytes class name

----------------------------------------------

1: 890617 470266000 [B

2: 890643 21375432 java.util.HashMap$Node

3: 890608 14249728 java.lang.Long

4: 13 8389712 [Ljava.util.HashMap$Node;

5: 2062 371680 [C

6: 463 41904 java.lang.Class





分别显示:序号、实例数量、总大小、类型



10) -XX:+TraceClassLoading

监控类的加载

[Loaded java.lang.Object from shared objects file]

[Loaded java.io.Serializable from shared objects file]

[Loaded java.lang.Comparable from shared objects file]

[Loaded java.lang.CharSequence from shared objects file]

[Loaded java.lang.String from shared objects file]

[Loaded java.lang.reflect.GenericDeclaration from shared objects file]

[Loaded java.lang.reflect.Type from shared objects file]





11) Xmn

设置新生代大小

-XX:NewRatio

新生代(eden+2*s)和老年代(不包含永久区)的比值

4 表示 新生代:老年代=1:4,即年轻代占堆的1/5

-XX:SurvivorRatio

设置两个Survivor区和eden的比

8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10





12) -XX:+HeapDumpOnOutOfMemoryError

OOM时导出堆到文件

-XX:+HeapDumpPath

导出OOM的路径

-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump





13)



打印GC的简要信息–[GC 4790K->374K(15872K), 0.0001606 secs]–

[GC 4790K->374K(15872K), 0.0001474 secs]–

[GC 4790K->374K(15872K), 0.0001563 secs]–

[GC 4790K->374K(15872K), 0.000168



这里-XX:+PrintGC,在GC前,堆空间4MB,GC后,堆为374KB,括号内表示当前可用堆为16MB





更详细的,需要-XX:+PrintGCDetails 参数;

-XX:+PrintGCTimeStamps–打印CG发生的时间戳?例–

[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs]

[Times: user=0.00 sys=0.00, real=0.00 se





-Xloggc:log/gc.log–指定GC log的位置,以文件输出–帮助开发人员分析问题



14) 可以设置-xms=-xmx,减少程序运行的时候垃圾回收次数,提高性能;



15) 堆的分配参数?-Xmn–设置新生代大小

?-XX:NewRatio–新生代(eden+2*s)和老年代(不包含永久区)的比值–4 表示 新生代:老年代=1:4=(老年代/新生代=-xx:NewRatio);



即年轻代占堆的1/5?

-XX:SurvivorRatio–设置两个Survivor区和eden的比–8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10



16)-XX:MaxDirectoryMemorySize,NIO用的直接内存,不属于堆;



17)./java -server -version

为服务模式,启动慢,但尝试更多信息去调优JVM,64位一般都为SERVER模式



18)标记清除算法,会产生碎片,适合老年代;标记复制算法,分两部分空间,把存活的对象赶到另外一半空间中,然后清除其中的有碎片的空间,适合新生代,因为垃圾多;



标记压缩算法:不需要两个空间,通过可达性分析,找到存活对象,直接压缩到另外一半空间,然后再清除剩下的,适合老年代;





19) JAVA强引用,软引用,弱引用,虚引用



参考:

https://mp.weixin.qq.com/s/Rua3dUJbSyk02ide0R7rSA



软引用:当堆空间不足的时候,软引用被回收;当普通GC的时候,软引用不一定会被回收;

弱引用:只要发现,一律回收;

软引用和弱引用,十分适合做缓存,当内存不足的时候可以回收,当内存足的时候可以在内存相当时间;

虚引用:就象没引用一样,随时回收;



20) 回收器

A) 新生代用串行收集器

最古老,最稳定

效率高

可能会产生较长的停顿

-XX:+UseSerialGC

新生代、老年代使用串行回收

新生代复制算法

老年代标记-压缩

B 老年代--串行收集器,使用标记压缩算法,老年代停顿时间长



C 新生代ParNew

-XX:+UseParNewGC

新生代并行

老年代串行



-XX:+UseConcMarkSweepGC:新生代用parnew,老生代用CMS

Serial收集器新生代的并行版本

复制算法

多线程,需要多核支持

-XX:ParallelGCThreads 限制线程数量



D 新生代parallelGC





类似ParNew

新生代复制算法,关注吞吐量

老年代 标记-压缩

更加关注吞吐量

-XX:+UseParallelGC

使用Parallel收集器+ 老年代串行

-XX:+UseParallelOldGC

使用Parallel收集器+ 并行老年代

-XX:MaxGCPauseMills

最大停顿时间,单位毫秒

GC尽力保证回收时间不超过设定值

-XX:GCTimeRatio

0-100的取值范围

垃圾收集时间占总时间的比

默认99,即最大允许1%时间做GC

这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优



E 老年代用并行parallelOldGC: 新生代用 parallelGC,老年代用并行,关注吞吐量



F CMS收集器

Concurrent Mark Sweep 并发标记清除

标记-清除算法

与标记-压缩相比

并发阶段会降低吞吐量

老年代收集器(新生代使用ParNew)

-XX:+UseConcMarkSweepGC





G CMS运行过程比较复杂,着重实现了标记的过程,可分为

初始标记

根可以直接关联到的对象

速度快

并发标记(和用户线程一起)

主要标记过程,标记全部对象

重新标记

由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正

并发清除(和用户线程一起)

基于标记结果,直接清理对象





-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次整理

整理过程是独占的,会引起停顿时间变长

-XX:+CMSFullGCsBeforeCompaction

设置进行几次Full GC后,进行一次碎片整理

-XX:ParallelCMSThreads

设定CMS的线程数量





21) MaxTenuringThreshole,参数控制新生代对象的最大年龄,控制经过多少次GC后,进入年老代;但有的时候,即使到了,也不一定会晋升的;



22) PretenureSizeThreshold参数,控制新生代对象直接进入到老年代,前提是关闭TLAB


推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
霜霜c
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有