堆栈、堆、方法区介绍

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

 

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

 

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

 

 

预备知识

java数据类型:

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

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

 

堆栈、堆、方法区

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

堆区:

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

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

栈区:

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

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

方法区:

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

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

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

 

栗子

 

public void test(){

  A a = new A();

  int b = 1;

}

public class A{

}123456789

这个栗子中

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

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

 

小结

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

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

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就 

走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自 

由度小。

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

度大。

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