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. HDU 3361 ASCII (水题,不说什么了)

    题意:给你n个十进制数,让你输出相应的ASCII. 析:无,没说的,直接输出就好了. 代码如下: #include <iostream> #include <cstdio> # ...

  2. VS2013支持多字节的方法

    参考链接: https://jingyan.baidu.com/article/6181c3e06ab30f152ff1534d.html

  3. 201709015工作日记--IntentService使用

    一.IntentService与Service的区别 Service 是 Android 四大组件之一,正常来说,我们直接使用 Service 就可以了. 但是 Service 存在几个问题: 默认不 ...

  4. OpenGL + MFC

    OpenGL超级宝典(中文版) 2001年 本书是一本完整而详尽的关于OpenGL的参考书,全书分为四部分:第一部分“OpenGL导言”介绍3D图形学的基本原理,读者将在此学会构造使用OpenGL的程 ...

  5. B-tree B+tree适合文件系统索引和MySQL索引

    B-树 B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树 它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点.下图是 B-树的简化图. B-树 ...

  6. hdu 2058 The sum problem(数学题)

    一个数学问题:copy了别人的博客 #include<cstdio> #include<cstdlib> #include<cmath> int main() { ...

  7. Android-Android/APP-理解

    Android 1.Google Android 给出的官方Android架构图就是大家都知道的四层,第一层是应用层(就是很多能够看得到的应用),第二层是应用框架层(为application提 供各种 ...

  8. Python学习-15.Python的中的套接字socket

    Python应用最广泛的要数web方面了.因此,socket显得十分重要. 要使用socket,必须引入socket模块,因此在Python脚本开头先写入 import socket 学过socket ...

  9. Simple Package Tool 学习

    Simple Package Tool 学习   1.getattr内置函数 getattr(object, name[, default]) python Packages.py install - ...

  10. ajax方式上传图片到Django后台

    参考价值最大 https://blog.csdn.net/huangql517/article/details/81259671 https://www.cnblogs.com/chenjianhon ...