jcmd jmap应用:一个String经典笔试题的验证

 

笔试题:

String strA = new String("123123");这一行中创建了几个String对象??
1 public class StringHeapCountTest {
2 
3     public static void main(String[] args) {
4         String strA = new String("123123");
5         System.out.println(1);
6     }
7 
8 }
这个题主要考察应试者对java内存结构(堆、非堆、栈、本地方法栈)、堆中的常量值、类加载和对象创建过程的了解程度。

一. 基准数据:首先我们看一下下面的代码, 什么都没有时在jvm堆中创建了多少String

1 public class StringHeapCountTest {
2 
3     public static void main(String[] args) {
4         System.out.println(1);
5     }
6 
7 }

在第4行打断点,然后使用jps打印出当前进程,再使用jmap -histo xxx打印当前jvm中的对象数。如下图所示,String有3778个

 

 

二,. 再看如下代码中String的个数

1 public class StringHeapCountTest {
2 
3     public static void main(String[] args) {
4         String strA = "123123";
5         System.out.println(1);
6     }
7 
8 }

如下图所示,String有3779个 ,比上一个实验多创建一个

 

 

三、 最后我们恢复文章开头题目中的第4行,再统计一下jvm中String的个数.如下图所示,3780个,创建两个

 

这个题目有很多变种,这里给出验证方法供参考。

 

jmap命令手册

-histo[:live]  to print histogram of java object heap; if the "live" suboption is specified, only count live objects

 

 

 @See String.intern()

 

GC ROOT: http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fgcroots.html&cp=37_2_3

 

 

jcmd 1.7新增命令 https://www.jianshu.com/p/388e35d8a09b,  可以替代jps jstack jmap jinfo

jcmd pid GC.class_histogram | grep java.lang.String

jcmd 9952 help 
The following commands are available:
...
VM.native_memory
 ... 
Thread.print                 打印线程栈
GC.class_stats            对象个数,占用字节数...
GC.class_histogram    打印class统计信息:对象个数,占用字节数。 只有两列,内容比GC.class_stats精简
GC.heap_dump            堆dump
GC.run_finalization
GC.run                         手动触发GC
VM.uptime                    启动时间
VM.flags                       启动参数 -XX
VM.system_properties 系统参数
VM.command_line       启动命令
VM.version 

转载于:https://www.cnblogs.com/yszzu/p/9270682.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值