2.详细图解JVM内存三大核心区域及其JVM内存案例剖析

原创 2016年05月30日 15:00:05

jvm的结构:


1.jvm内存的三大核心区域(方法区,java heap 和java stack)


代码:

package com.dt.spark.jvm.basics;


/**
 * 从JVM调用的角度分析Java程序对内存空间的使用:
 * 当JVM进程启动的时候,会从类加载路径中找到包含main方法的入口欧蕾HelloJVM;
 * 找到HelloJVM后会直接读取该文件中的二进制数据并且把该类的信息放到运行收的Method内存区域中;
 * 然后会定为到HelloJVM中的main方法的字节码中并开始执行main方法中的指令:
 * Student student = new Student("测试spark");
 * 此时会创建Student实例对象并且使用student来应用该对象(或者说对该对象命名),其内幕如下:
 * 第一步:JVM会直接到Method区域中去查找Student类的信息,此时发现没有Student类,就通过
 * 类加载器加载该Student类文件;
 * 第二步:在JVM的Method区域加载并找到了Student类之后会在Heap区域中为Student实例对象分配内存
 * 并且在Student的实例对象中持有指向方法区域中的Student类的应用(内存地址);
 * 第三步:JVM实例完后会在当前线程中为Stack中的referenc建立实际的应用关系,此时会赋值给student
 * 
 * 在JVM中方法的调用一定是属于线程的行为,也就是说方法调用本身会发展在调用线程的方法调用栈:
 * 线程的方法调用栈(Method Stack Frames),每一个方法的调用就是方法调用栈中的一个Frame,该
 * Frame包含了方法的参数、局部变量、临时数据等:
 * student.sayHello();
 * 
 * 
 * @author hp
 *
 */
public class HelloJVM {
/**
* 在JVM运行的时候会通过反射的方式到Method区域找到入口类的入口方面main
* @param args
*/
public static void main(String[] args) {//main方法放在Method方法区域中
/**
* student是放在主线程中的Stack区域中的;
* Student对象实例是放在所有线程共享的Heap区域中的;
*/
Student student = new Student("测试spark");

/**
* 首先会通过student指针(句柄)找Student对象,当找到该对象后
* 会通过对象内部指向方法区域中的指针来调用具体的方法去执行任务
*/
student.sayHello();
}


}


class Student{
//name本身作为成员是放在Stack区域的,但是name指向的String对象是放在Heap中;
private String name; 

public Student(String name){
this.name = name;
}

public void sayHello(){//sayHello这个方法是放在方法区域中的;
System.out.println("Hello, this is " + this.name);
}
}





0010 Java JVM虚拟机7块内存区划分【入门】

Java中内存的管理机制是通过JVM来自动管理的。了解JVM的基础原理有利于进一步理解Java。 我们首先要了解java内存的分配机制,在java虚拟机规范里,JVM被分为7个内存区域。 虚拟器规范中...
  • junlinbo
  • junlinbo
  • 2014年12月18日 22:25
  • 1207

JVM内存区域详解

JVM内存模型总体架构图 程序计数器 多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源。因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指...
  • qq_36859415
  • qq_36859415
  • 2016年11月30日 14:22
  • 2309

JVM内存结构图解 (四)

四 数据类型占用空间分析   操作数栈:long和double需要占用2个栈深单位(unit of depth),其它类型占用1个栈深单位。   局部变量表:long和double需要占用...
  • shenhonglei1234
  • shenhonglei1234
  • 2017年02月09日 17:06
  • 401

JVM 内存调优 与 实际案例

堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space。 Permanent 即 持久代(Permanent Generation),主...
  • jack85986370
  • jack85986370
  • 2016年10月24日 12:09
  • 2275

最简单例子图解JVM内存分配和回收

JVM采用分代垃圾回收。在JVM的内存空间中把堆空间分为年老代和年轻代。将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象。年轻代中又被分为Eden...
  • Mr__fang
  • Mr__fang
  • 2014年07月25日 17:33
  • 715

第2课:全球详细图解JVM内存三大核心区域及其JVM内存案例实战剖析

王家林老师微博: http://weibo.com/ilovepains/   第2课:全球详细图解JVM内存三大核心区域及其JVM内存案例实战剖析   debug截图...
  • duan_zhihua
  • duan_zhihua
  • 2016年04月03日 09:16
  • 533

jvm内存三大核心区域

jvm内存三大核心区域
  • kaikai_sk
  • kaikai_sk
  • 2017年08月04日 08:57
  • 66

JVM内存限制和调整

今天用java -jar执行一个jar文件提示内存不够,需要设置虚拟机的堆大小。以下是参考资料: 堆(Heap)和非堆(Non-heap)内存    按照官方的说法:“Java 虚拟机具有一个堆,...
  • z69183787
  • z69183787
  • 2014年03月22日 20:19
  • 3197

myeclipse 调大jvm 内存

参数-XX:-UseSplitVerifier -Xmx1024M -Xms512M -XX:MaxPermSize=256m说明: Xms512m 代表堆内存初始值为512MB Xmx1024m...
  • u010503822
  • u010503822
  • 2017年04月27日 14:55
  • 608

【深入理解JVM】:Java内存区域

JVM具有自动内存管理机制,Java不需要像c/c++一样,为每一个new操作写配对的delete/free代码,不容易出现内存泄露和溢出。JVM内存区域主要包括如下部分:程序计数器、Java虚拟机栈...
  • u011080472
  • u011080472
  • 2016年05月05日 09:50
  • 1821
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2.详细图解JVM内存三大核心区域及其JVM内存案例剖析
举报原因:
原因补充:

(最多只允许输入30个字)