package org.burning.sport.jvm;

/**
*  从JVM调用的角度分析Java程序对内存空间的使用,
* 当JVM进程启动的时候,会从类加载器路径中找到包含main方法的入口类HelloJVM
* 找到HelloJVM后会直接读取该文件中的二进制数据并且把该类的信息放到Method内存区域中
* 然后会定为HelloJVM中的main方法的字节码中并开始执行main方法中的指令
* Student student = new Student("张三");
* 此时会创建Student实例对象并且使用student来为该对象命名,其步骤如下:
* 步骤一:JVM会直接到Method区域中去查找Student类的信息,此时发现没有Student类,就通过类加载器加载该Student类文件
* 步骤二:在JVM的Method区域加载并找到了Student类之后会在Heap区域中为Student实例对象分配内存并且在
* Student的实例对象中持有指向方法区域中的Student类的引用(内存地址)
* 步骤三:JVM实例完后会在当前线程中为Stack中的reference建立实际的引用关系,此时会赋值给student
*
* 在JVM中方法的调用一定是属于线程的行为,也就是说方法调用本身会发生在调用线程的方法调用栈:
* 线程的方法调用栈(Method Stack Frames),每一个方法的调用就是方法调用栈中的一个Frame,该Frame包含了
* 方法的参数、局部变量、临时数据等
* student.sayHello();
*  @ProjectName: base-project 
*  @Description:
*  @author: lisen
*  @date: 2018/4/15  
*/
public class HelloJVM {
// JVM运行的时候会通过反射的方式到Method区域找到入口类的入口方法main()
public static void main(String[] args) {
// student是放在主线程的Stack区域中的
//Student对象实例是放在所有线程共享的Heap区域中的
Student student = new Student("张三"); //首先会通过student指针(句柄)找到Student对象,当找到该对象后
//会通过对象内部指向方法区域中的指针来调用具体的方法去执行任务
student.sayHello();
}
}
class Student {
private String name; public Student(String name) {
this.name = name;
} // sayHello()这个方法是放在方法区的
public void sayHello() {
System.out.println("Hello, this is " + name);
}
}

参考:

(01)JVM-内存三大核心区域以及分析的更多相关文章

  1. JVM内存回收对象及引用分析

    自动垃圾回收是Java相较于C++的一个重要的特点,想了解JVM的垃圾回收机制,首先我们要知道垃圾回收是回收什么地方的垃圾,我在我的上一篇博客<JVM内存区域划分>里面有写到JVM里面的内 ...

  2. jvm 内存,线程,gc分析

    1.查看 gc的次数,和各个垃圾回收区域的内存比例  jstat : jstat -gcutil pid interval(ms) 例子:jstat -gcutil 332 1000 参数说明如下: ...

  3. JVM内存状况查看方法和分析工具

    Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及JVM内存的状况,同时开源界和商业界也有一些工具可用于查看.分析GC及JVM内存的状况.通过这些分析,可以排查程序中内存泄露的问题及 ...

  4. JVM内存状况查看方法和分析工具-jmap

    jmap -heap 27657 Attaching to process ID 27657, please wait... Debugger attached successfully. Serve ...

  5. MAT实战:JVM内存溢出的定位与分析

  6. 说下Java堆空间结构,及常用的jvm内存分析命令和工具

    Java堆空间结构图:http://www.cnblogs.com/SaraMoring/p/5713732.html JVM内存状况查看方法和分析工具: http://blog.csdn.net/n ...

  7. JVM内存结构详解

    从java编程语言说起... 1. Java编程语言简介 1.1 编程语言概述 系统级和应用级 系统级:C,C++,go,erlang 应用级:C#,Java,Python,Perl,Ruby,php ...

  8. [jvm]运行时数据区域详解

    了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...

  9. Jvm内存工具

    1,JConsole  位于 [JDK] bin 下, 2,代码查看当前进程堆内存 long maxMemory = Runtime.getRuntime().maxMemory();long tot ...

随机推荐

  1. 基于图像切换器(imageSwitcher)的支持动画的图片浏览器

    利用GridView和ImageSwitcher的基本用法 public class MainActivity extends Activity { int[] imageIds = new int[ ...

  2. hdu 2049 不容易系列之考新郎 && 对错排的详解

    题目 错排:  当n个编号元素放在n个编号位置,错排的方法数记着D(n) ⒈把第n个元素放在一个位置,比如位置k,一共有(n-1)种方法: ⒉放编号为k的元素,这时有两种情况: 1°把它放到位置n,那 ...

  3. POJ2653判断线段相交

    POJ2653 题目大意:按顺序放木棒,问最后所有的木棒中上面没有木棒的木棒的索引是…… 思路:按理说线段相交的题目做的听多了,这个应该不算新鲜,但是这个题,还是让我学到了认真读题,面对这个题很容易想 ...

  4. Intellij IDEA 14的注册机(Java版)

    import java.math.BigInteger; import java.util.Date; import java.util.Random; import java.util.zip.CR ...

  5. Oracle EBS标准错误信息如何追踪 (Debug)

    http://www.cnblogs.com/songdavid/articles/2067534.html 调用EBS标准API的时候,可能会返回一些让人看不懂的错误,比如最近我在开发rcv_tra ...

  6. Windows / Windows Phone 8.1 预留应用名称及应用上传

    最近比较懒好久没有来这里跟大家聊了,WP 8.1 的 preview 发布已经有一阵子了,并且商店支持 8.1 应用也有一段时间了.我就把这篇 8.1 的应用商店预留提交作为 8.1 的一个开始吧. ...

  7. SQL Server Extended Events 进阶 1:从SQL Trace 到Extended Events

    http://www.sqlservercentral.com/articles/Stairway+Series/134869/ SQL server 2008 中引入了Extended Events ...

  8. Linux 防火墙iptables命令详解

    [转:原文链接] iptables -Fiptables -Xiptables -F -t mangleiptables -t mangle -Xiptables -F -t natiptables ...

  9. java keytool生成ssl加密密钥

    教程:http://www.cnblogs.com/getherBlog/p/3930317.html 其中用到几个命令: keytool -genkeypair -alias certificate ...

  10. 初识构建工具-gradle

    构建工具的作用 依赖管理 测试,打包,发布 主流的构建工具 Ant:提供编译,测试,打包 Maven:在Ant的基础上提供了依赖管理和发布的功能 Gradle:在Maven的基础上使用Groovy管理 ...