美文网首页
Java内存分配(转)

Java内存分配(转)

作者: 耳_总 | 来源:发表于2017-07-21 22:30 被阅读7次

一、 基本概念
每运行一个Java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈。进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享。Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始化这个对象中变量。虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放指向这个堆对象的引用而已。局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。
具体的概念:JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method,也叫静态区):

堆区:

1.存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令) ;
2.jvm只有一个堆区(heap),且被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身和数组本身;

栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型本身和自定义对象的引用;
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问;
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令);

方法区(静态区):
1.被所有的线程共享,方法区包含所有的class(class是指类的原始代码,要创建一个类的对象,首先要把该类的代码加载到方法区中,并且初始化)和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

3 常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。
http://blog.csdn.net/davidwma/article/details/71438000

相关文章

  • Java内存泄露

    1. Java内存回收机制 原文转自:Java 内存泄露 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地...

  • Java内存分配(转)

    一、 基本概念每运行一个Java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Jav...

  • 06 性能优化-内存优化-内存的分配和回收机制

    1 Java内存分配机制和回收机制 1.1、Java的内存分配区域 Java内存分配主要包括以下几个区域: 方法区...

  • Android性能优化之常见的内存泄漏

    内存泄漏 Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配,...

  • JVM内存模型

    概览 Java程序内存的分配是在JVM虚拟机内存分配机制下完成,Java内存模型(Java Memory Mode...

  • Java内存分配

    Java内存分配

  • 实例变量与类变量

    java内存管理分为两个方面:内存分配和内存回收,这里的内存分配是指创建java对象时jvm为该对像在堆内存中分配...

  • Android 内存泄漏相关总结

    一.Java内存分配结构复习 1.Java内存分配策略 上一篇Android内存管理分析总结中我们提到了Java内...

  • Java中四种引用

    Java内存管理包括内存分配和内存回收。 内存分配:程序员通过new对象,JVM会自动为该对象分配内存。 内存回收...

  • Java编程语言:java中四种引用!欢迎补充

    Java内存管理包括内存分配和内存回收。 内存分配:程序员通过new对象,JVM会自动为该对象分配内存。 内存回收...

网友评论

      本文标题:Java内存分配(转)

      本文链接:https://www.haomeiwen.com/subject/yeifcxtx.html