番外篇01____JVM篇01

偶尔善良 提交于 2019-11-30 07:48:01

JVM篇_01

犹豫了好久,没想好休息日更数据结构还是算法还是JVM。想了半天,还是更新JVM吧,毕竟现在的项目架构对于JVM调优还是有需要的,并且面试的时候靠这个能稍微吹一吹(当然了,真让我深入也深入不进去,我太菜)

明确几个小概念

JVM中,数据类型分两类:
基本类型:8种
引用类型:类、接口、数组

堆和栈:
stack和heap的概念真的要说吐了,,,
简要概括吧,stack是运行时的单位,heap是存储的单位;就是说一个线程有一个线程栈,但是大家的对象都是一起“扔”到heap里的。
要说就说点和别人不一样的。我打算说说为什么要把stack和heap区别开
1、从设计的角度来说,stack的工作是逻辑处理,heap是存储数据,分工明确,该干什么就干什么
2、按照这种方式分开后,数据就可以实现共享的目的,可以被stack1和stack2都拿到,好处多多
3、学过string和stringbuffer吧?动态增长是有好处的,不再赘述。这里stack专门用来存地址,而heap存储对象数据,其实这里是允许动态增长的。stack只需要指向它就可以了
4、遵守面向对象的思想。为什么这么说?heap像不像属性。。stack像不像方法。。我指的是根据已有的调用关系

还记得第一节课学到的main方法吗?main就是stack的起始点,甚至可能创造出更多的线程。

在stack中,一个对象只对应了一个4byte的引用,是不是很小?最大的基本类型数据就是long和double,8个字节,还是小于4byte的,所以基本类型数据存放到stack中足够了

那么再说一个常见的问题
java中的参数传递是传值还是传引用?
传值,别问为什么,这是java不是C。这里我不想展开说,因为这个地方如果想不明白可能会绕进去,记住就好了

在java中,stack通过-Xss设置,当stack存储数据较多,可以调大这个值。不知道你们有没有遇到过StackOverflowError这个异常,如果没有遇到过,请你自己写一个无法返回的递归。

你知道一个空的Object对象是多大码?8byte
那么我问你,根据我上面说过的东西,问你个问题

	Object obj = new Object(); //这句话在内存占据空间多大?

4byte+8byte,能理解吧。Object是个各类的祖父,所以不管什么java对象,大小都会大于8byte

那么,既然知道了Object对象的大小,就可以计算其他对象的大小了

	class OjbectDemo{
		int sum;
		boolean flag;
		Object obj;
	}

它的大小为:8+4+1+4=17byte。java在对对象分配内存时是以8的倍数存储的,所以这里所占用的实际内存时24byte
那么如果是包装类怎么办?就是当最对象来看,12byte,因为是8的倍数就是16byte。这个内存占比。。其实很大了,就算是long类型都是2倍,int是4倍,要是boolean…就是因为太浪费内存了,所以jdk1.5之后增加了自动拆装箱

今天先弄这么多,下次说说强引用,软引用、弱引用、虚引用是怎么回事(虽然这个也说烂了吧。。)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!