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. 笔记本的Windows系统怎么设置有了外接鼠标后停用触摸板

    点击控制面板,切换小图标模式,找到鼠标,点击它,然后会弹出一个窗口,找到ELAN选项卡(一般有个红色图标,不过可能需要对应驱动才会有此选项卡),选中插入外置 USB 指向装置时禁用.点击确定保存配置即 ...

  2. DataFrame按行读取:DataFrame之values

    http://blog.csdn.net/u014607457/article/details/51290582 def fill_core(self): RatingTable=pd.read_cs ...

  3. VHDL 中的数据转换函数

    2013年8月5日 ieee.std_logic_arith.all SXT:是对std_logic_vector转换成std_logic_vector数据类型,并进行符号扩展. <slv_sx ...

  4. 20155302 2016-2017-2 《Java程序设计》第六周学习总结

    20155302 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入 ...

  5. 快速学会在JSP中使用EL表达式

    在没有学会EL表达式之前,我们想在JSP文件中获取servlet或者其他JSP页面传来的值,通常都是在JSP页面中编写java代码来实现.而在jsp页面编写Java 代码,这种做法时不规范的,将会产生 ...

  6. 打开AVD时报”Data partition already in use. Changes will not persist!”

    错误信息 WARNING: Data partition already in use. Changes will not persist! WARNING: SD Card image alread ...

  7. 微软DevOps软件开发高级培训课程(深圳站) 2016.04.06

    深圳特区云集了国内众多大型IT企业,作为北上广深的一线城市,当之无愧! 我们在深圳同方信息港的微软办公室是举行培训,60人的培训教室,生生被挤满了80人,过道都被全部占用了.可惜由于换了电脑,把照片搞 ...

  8. linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程

    本节目标: 复制进程映像 fork系统调用 孤儿进程.僵尸进程 写时复制 一,进程复制(或产生)      使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文.进程堆栈. ...

  9. C#全局键盘监听(Hook)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

  10. Dependency injection configurations into views in asp.net core

    本文展示如何在ASP.NET Core MVC Application Razor视图中注入和使用应用程序的配置信息. 将配置信息添加到appsettings.json中: { "Loggi ...