对于Java程序来说,内存大体上是分两个部分的.堆和栈.堆放对象和字符串,因为String也是一个类.栈放基本的数据类型,例如int,short,float等等.还有第三个部分是从栈里面分出来的,叫静态堆栈区(好像是这个名),是放用static定义的变量的.
首先从主方法开始,内存开辟了一个堆区,这个堆里面放的是Test对象的实例,然后又开辟了一个栈区,栈里面放的是Test对象的引用t,这个t就是指向了堆里面的Test对象.堆里面的Test实例有三个方法,今天这一节我更愿意用重载来解释这三个方法的关系,这样更准确,因为多态的概念太大了,这里确实也有多态的特性,但是多态用于解释接口和实现类之间的关系应该更好吧.回归正题,这三个方法被放在了堆里面,但是这三个方法都有参数,这些参数就是局部变量,是放在栈里的.每次调用一个方法时,程序给这些参数创建几个临时变量,一旦方法调用完毕这些变量就会被销毁.对于定义在主方法中的变量,是在主方法调用完毕后销毁的.另外,由于t存放在栈中,t指向的Test对象是存放在堆中的,所以主方法调用完毕先会销毁t,然后垃圾回收器发现没有变量指向Test对象了,就会在栈中把Test销毁.
建议楼主看一下马士兵的java基础视频教程,前面讲内存讲的很详细.
使用java自带的性能分析工具jvisualvm , 可以方便的查看内存, 对象, 线程等多种信息.
win+R?然后输入?jvisualvm?回车即可
效果如下图
对于每一个java进程来说都有自己的内存池和使用空间,而这也就意味着会出现内存使用错误等问题,而这时候我们就需要对java内存进行诊断分析,今天云南java培训就一起来了就一下,在进行内存诊断上都有哪些软件可以使用.
Java堆:分析诊断数据
堆转储分析
堆转储可以使用如下的工具进行分析:
EclipseMAT(内存分析工具,MemoryAnalyzerTool)是一个社区开发的分析堆转储的工具.它提供了一些很棒的特性,包括:
可疑的泄漏点:它能探测堆转储中可疑的泄露点,报告持续占有大量内存的对象;
直方图:列出每个类的对象数量、浅大小(shallow)以及这些对象所持有的堆.直方图中的对象可以很容易地使用正则表达式进行排序和过滤.这样有助于放大并集中我们怀疑存在泄露的对象.它还能够对比两个堆转储的直方图,展示每个类在实例数量方面的差异.这样能够帮助我们查找Java堆中增长快的对象,并进一步探查确定在堆中持有这些对象的根;
不可达的对象:MAT有一个非常棒的功能,那就是它允许在它的工作集对象中包含或排除不可达/死对象.如果你不想查看不可达的对象,也就是那些会在下一次GC周期中收集掉的对象,只关心可达的对象,那么这个特性是非常便利的;
重复的类:展现由多个类加载器所加载的重复的类;
到GC根的路径:能够展示到GC根(JVM本身保持存活的对象)的引用链,这些GC根负责持有堆中的对象;
OQL:我们可以使用对象查询语言(ObjectQueryLanguage)来探查堆转储中的对象.它丰富了OQL的基础设施,能够编写复杂的查询,帮助我们深入了解转储的内部.
Java任务控制(JavaMissionControl)的JOverflow插件:这是一个实验性的插件,能够让Java任务控制执行简单的堆转储分析并报告哪里可能存在内存浪费;
Yourkit是一个商业的Javaprofiler,它有一个堆转储分析器,具备其他工具所提供的几乎所有特性.除此之外,YourKit还提供了:
可达性的范围(reachabilityscope):它不仅能够列出可达和不可达的对象,还能按照它们的可达性范围显示它们的分布,也就是,强可达、弱/软可达或不可达;
内存探查:YourKit内置了一组全面的查询,而不是使用ad-hoc查询功能,YourKit的查询能够探查内存,查找反模式并为常见的内存问题分析产生原因和提供解决方案.
hi:
虚拟机的内存情况查看,使用Runtime类进行.如下:
//虚拟机内存使用量查询
class RamRun implements Runnable{
private Runtime runtime;
public void run(){
try{
runtime=Runtime.getRuntime();
System.out.println("处理器的数目"+runtime.availableProcessors());
}catch(Exception e){
e.printStackTrace();
}
以上就是土嘎嘎小编为大家整理的java分析代码内存相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!