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

Posted funny_coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

以上是关于jmap应用:一个经典String笔试题的验证的主要内容,如果未能解决你的问题,请参考以下文章

经典笔试题:通过JDK自带工具实现一个间隔并发执行的定时任务

经典PHP笔试题

经典笔试题:标号1-n的n个人首尾相接,1到3报数,报到3的退出,求最后一个人的标号

经典笔试题:标号1-n的n个人首尾相接,1到3报数,报到3的退出,求最后一个人的标号

Core Java 经典笔试题总结(异常类问题)

—— 这些经典笔试题,你确定都做过吗?