堆栈、堆、方法区介绍
终于开始看java啦…不知道有没有很多人跟我一样想法,先把安卓看完了再去看java,因为安卓直接跟工资挂钩而java更多的是内功.直到前段时间我和我们这边后台大佬对接开发websocket噩梦就开始了,这个线程不安全,这个单例在某些情况下有问题,这里应该这样封装等等…..每天围绕在我脑边,本来就是第一次做websocket,在加上后台大佬java大法猛如虎,真是感觉自己啥也不会了.
…不过现在是熬过来啦而且以后我可以说我做过基于websocket协议的im啦啦啦啦,容我嘚瑟一波哈哈哈哈( 这里需要感谢后台大佬刚哥带我把im搞了一遍:) )
这里也是预告我后面会写websocket的blog总结的,还往大家捧场.扯远了,回到主题正是因为这次经历让我意识到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是基础数据类型所以在栈中.
小结
这里用一个在别处看到的栗子总结再好不过
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
度大。
第一次blog写这么短有点方.如果有错误的地方还望大佬们指出…小弟感激涕零
原文链接:https://blog.csdn.net/zly921112/article/details/61192747