jvm分为以下5部分
1.虚拟机栈:用来存放基本数据类型以及指针(对象的地址),方法帧
2.堆:用来存放对象(包括对象的属性)以及数组,又可以细分为:新生代和年老代
3.方法区:用来存放类的基本信息,字段的信息,方法的信息,被称为持久代,里面包含有常量池(如:String或者通过final修饰的变量)
以及静态区(静态块以及静态变量)
4.本地方法栈:用来为jvm调用执行本地方法(native)提供服务
5.计数器:包含了要执行了下一段代码的指令信息
局部变量和成员变量(对象属性)的区别:
栈中的数据是各个线程所独有的,每个线程都对应的有自己的栈数据信息,堆中的数据则被多个线程共享,
在运行时当调用相关的方法时,就会从方法区中找到对应的方法并将其入栈,方法执行完毕后则出栈,
因此对于方法中的局部变量当方法执行完毕后,随着方法一同释放,但对应的堆中的对象还有可能被栈
中其他指针引用所以不能被释放,即使没有被任何指针引用也不会马上释放而是当进行gc时再将其释放。
从jvm的角度看局部变量有利于内存空间的更高效的利用而成员变量则可以在多个方法之间共享。
栈中存放的基本数据类型为1-8字节,而引用类型的指针为4字节。一个空对象的大小是8字节。
存放的是固定长度数据,而堆中存放的数据是在运行时动态创建的,大小也是动态的。
如数组和对象的大小都是动态的而不是固定不变的。
jvm栈代表处理逻辑,jvm中堆代表数据。
对象的属性就是数据存放在jvm的堆中,对象的行为(方法),就是运行逻辑,存放在jvm栈中。
我们编写对象的时候,即编写了数据结构,也编写了处理数据的逻辑(算法)。
注意:
1.当jvm启动出现内存溢出时,我们通常调整持久代也就是方法区的大小。
2.当jvm在运行过程中出现内存溢出时,我们通过调整堆的大小。
3.在进行大批数据的提交或者提取的时候,可以采用分段批量提交或者分段批量提取,否则容易产生内存溢出错误。
4.在解析大的xml文件的时候,采用sax基于事件的解析方式,避免采用dom4j,因为dom4j是一下子把整个xml加载到
内存中容易出现内存溢出。
1.虚拟机栈:用来存放基本数据类型以及指针(对象的地址),方法帧
2.堆:用来存放对象(包括对象的属性)以及数组,又可以细分为:新生代和年老代
3.方法区:用来存放类的基本信息,字段的信息,方法的信息,被称为持久代,里面包含有常量池(如:String或者通过final修饰的变量)
以及静态区(静态块以及静态变量)
4.本地方法栈:用来为jvm调用执行本地方法(native)提供服务
5.计数器:包含了要执行了下一段代码的指令信息
局部变量和成员变量(对象属性)的区别:
栈中的数据是各个线程所独有的,每个线程都对应的有自己的栈数据信息,堆中的数据则被多个线程共享,
在运行时当调用相关的方法时,就会从方法区中找到对应的方法并将其入栈,方法执行完毕后则出栈,
因此对于方法中的局部变量当方法执行完毕后,随着方法一同释放,但对应的堆中的对象还有可能被栈
中其他指针引用所以不能被释放,即使没有被任何指针引用也不会马上释放而是当进行gc时再将其释放。
从jvm的角度看局部变量有利于内存空间的更高效的利用而成员变量则可以在多个方法之间共享。
栈中存放的基本数据类型为1-8字节,而引用类型的指针为4字节。一个空对象的大小是8字节。
存放的是固定长度数据,而堆中存放的数据是在运行时动态创建的,大小也是动态的。
如数组和对象的大小都是动态的而不是固定不变的。
jvm栈代表处理逻辑,jvm中堆代表数据。
对象的属性就是数据存放在jvm的堆中,对象的行为(方法),就是运行逻辑,存放在jvm栈中。
我们编写对象的时候,即编写了数据结构,也编写了处理数据的逻辑(算法)。
注意:
1.当jvm启动出现内存溢出时,我们通常调整持久代也就是方法区的大小。
2.当jvm在运行过程中出现内存溢出时,我们通过调整堆的大小。
3.在进行大批数据的提交或者提取的时候,可以采用分段批量提交或者分段批量提取,否则容易产生内存溢出错误。
4.在解析大的xml文件的时候,采用sax基于事件的解析方式,避免采用dom4j,因为dom4j是一下子把整个xml加载到
内存中容易出现内存溢出。