Java 永久代是非堆内存的组成部分,用来存放类名、访问修饰符、常量池、字段描述、方法描述等,因运行时常量池是方法区的一部分,所以这里也包含运行时常量池。我们可以通过 jvm 参数 -XX:PermSize=10M -XX:MaxPermSize=10M
来指定该区域的内存大小,-XX:PermSize
默认为物理内存的 1/64 ,-XX:MaxPermSize
默认为物理内存的 1/4 。String.intern()
方法是一个 Native 方法,它的作用是:如果字符串常量池中已经包含一个等于此 String 对象的字符串,则返回代表池中这个字符串的 String 对象;否则,将此 String 对象包含的字符串添加到常量池中,并且返回此 String 对象的引用。在 JDK 1.6 及之前的版本中,由于常量池分配在永久代内,我们可以通过 -XX:PermSize
和 -XX:MaxPermSize
限制方法区大小,从而间接限制其中常量池的容
在 JDK 1.2 之前,Java 对象的引用很传统:如果 reference 类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种状态下只有被引用或不被引用两种状态,有时候我们希望描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。
<!-- more -->
标记,标记之前内容为摘要
VisualVM(All-in-One Java Troubleshooting Tool) 是随 JDK 发布的一款功能强大的运行监视和故障处理程序。除了运行监视、故障处理之外,它还提供了性能分析等其他功能。与其他功能相比,VisualVM 不需要被监视程序基于特殊的 Agent 运行,因此他对应用程序的实际性能影响很小,使得它可以直接应用在生产环境中。
<!-- more -->
标记,标记之前内容为摘要
<!-- more -->
标记,标记之前内容为摘要
Java 堆用于存储对象实例,只要不断地创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,则在对象数量到达最大堆的容量限制后就会产生内存溢出异常。因此我们用编写如下代码来模拟内存溢出
JConsole(Java Monitoring and Management Console)是一种基于JMX的可视化监视、管理工具。它管理部分的功能是针对 JMX MBean 进行管理,由于 MBean 可以使用代码、中间件服务器的管理控制台或者所有符合 JMX 规范的软件进行访问。
jhat(JVM Heap Analysis Tool) 主要是为了和 jmap 搭配使用,来分析 jmap 生成的转储快照。jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 文件的分析结果后,可以在浏览器中查看。不过在实际工作中,一般都不会去直接使用 jhat 命令来分析 dump 文件。
jinfo(Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。使用 jps -v
命令参数可以查看虚拟机启动时显式指定的参数列表,如果想知道未被显式指定的参数的系统默认值,除了去找资料外,还可以使用 jinfo -flag
命令进行查询。