jvm一点内存的知识(持续积累中)

来源:互联网 发布:小米无线鼠标mac 编辑:程序博客网 时间:2024/05/21 10:04

Integer i = 1;

int i = 1;

在使用的过程中差别并不是很大 可是在底层存储的时候明显有很大区别(这个也是在阅读了前辈的博客知道的再次感谢)

首先说Integer是包装类 int 是基本类型

int i = 1; 这个1是存在常量池的,常量池是在方法区中。

Integer i = 1; 这个存储在堆里的。栈里存储是参照表中的引用(这个参照表在看C++基础的时候也看到过,具体怎么弄的我不知道得看汇编了)。

这里的堆栈是指jvm的。

C++里面可以选择传引用传指针传值 可是在java里不涉及到这些。为什么?

原因还是jvm这个jvm都已经封装过了。既然jvm封装了入口那销毁的时候也是做了封装的 于是就有了gc 。于是就比C++程序员省了很多精力。

同时也降低了java的上手难度。gc究竟怎么处理?(很好奇)。

jvm封装的 究竟是传的引用还是值?

对象的时候传的引用,基本类型肯定传的值。


学习了一下jvm的内存分配  堆(全是对象实例数据),栈(关键在栈帧,执行方法开始,入栈出栈),方法区(类信息(比如类类型)、常量、静态变量),本地方法栈(有的jdk跟java栈是在一起的),常量池(方法区中),直接内存(典型的IO就是用的这个。延伸到流接着就是操作系统,不同的操作系统IO的速度是不同的)

jvm分配规则还是蛮好的懂的。了解这些有什么用?

有的时候真的会用到,比如jvm优化?为什么要优化?速度慢了,内存溢出了,栈内存溢出了根据栈的特性很快可以定位到异常的出处(肯定是在执行某个方法的时候即使不看代码)。在比如我们常用的Eclipse 有的电脑跑起来就慢,有的快,当然这个是跟内存有关系的 。这时候我们就可以修改Eclipse的内存分配。在比如Wicket这个框架,这个就很吃内存,启动项目没事,跑跑就抛内存溢出。如果不知道优化一点这个问题是很棘手的。因为程序真的没错。

PS:我现在是这样理解的,有错误的地方欢迎阅读的朋友指正,非常感谢。

0 0