堆栈、堆、方法区介绍

堆栈、堆、方法区介绍

终于开始看java啦…不知道有没有很多人跟我一样想法,先把安卓看完了再去看java,因为安卓直接跟工资挂钩而java更多的是内功.直到前段时间我和我们这边后台大佬对接开发websocket噩梦就开始了,这个线程不安全,这个单例在某些情况下有问题,这里应该这样封装等等…..每天围绕在我脑边,本来就是第一次做websocket,在加上后台大佬java大法猛如虎,真是感觉自己啥也不会了.

…不过现在是熬过来啦而且以后我可以说我做过基于websocket协议的im啦啦啦啦,容我嘚瑟一波哈哈哈哈( 这里需要感谢后台大佬刚哥带我把im搞了一遍:) )

这里也是预告我后面会写websocket的blog总结的,还往大家捧场.扯远了,回到主题正是因为这次经历让我意识到java的重要,重要的事再说一遍我要开始学java了.后面会陆续更新这个系列.觉得写得好的不好的都给点个赞蛤,感谢!

预备知识

  • java数据类型:

    1. 基础数据类型:boolean、byte、short、char、int、long、float、double

    2. 引用数据类型:类、接口、数组

堆栈、堆、方法区

JAVA的JVM的内存可分为3个区:堆(heap)、堆栈(stack)和方法区(method)

  • 堆区:

    1. 提供所有类实例和数组对象存储区域

    2. jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

  • 栈区:

    1. 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

    2. 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

  • 方法区:

    1. 又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

    2. 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

    3. 运行时常量池都分配在 Java 虚拟机的方法区之中

栗子


public void test(){
  A a = new A();
  int b = 1;
}

public class A{

}

这个栗子中

  • a是A对象的引用所以放在栈中,A是自定义对象所以放在堆中.

  • b是基础数据类型所以在栈中.

小结

这里用一个在别处看到的栗子总结再好不过

堆和栈的区别可以用如下的比喻来看出:

  • 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
    走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
    由度小。

  • 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
    度大。

第一次blog写这么短有点方.如果有错误的地方还望大佬们指出…小弟感激涕零

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页