龙空技术网

java入门06--jvm运行时数据区域

icheck 107

前言:

今天你们对“java数据范围怎么实现”大约比较关怀,你们都想要学习一些“java数据范围怎么实现”的相关资讯。那么小编也在网上收集了一些关于“java数据范围怎么实现””的相关知识,希望咱们能喜欢,小伙伴们快快来学习一下吧!

文章旨在循序渐进学习java,点赞关注+收藏

了解的意义:职业生涯中如果跳槽,面试中经常会被问到;另外了解这个,对于工作有帮助,首先对于排查问题有作用,另外对于多线程使用也有一定帮助;

工作中用的最多的ctrl+c ctrl+v,在某些时候用处不大,但是了解深入后会有不一样的收获

参考:深入理解JVM虚拟机(文章内容比较多,本文从应用视角出发讲解)

线程共享: 方法区 堆区

线程隔离:虚拟机栈和本地方法栈 程序计数器 其他区域不讨论

方法区:加载类信息 常量 静态变量 即时编译后的代码缓存数据等

堆区: 存放对象实例 垃圾回收采用分代算法的话,新生代(eden s0 s1) 老年代(关于垃圾回收后续再续)

虚拟机栈:局部变量表 操作数栈 动态链接 方法出口

程序计算器:程序控制流的指示器,分支(if swtich) 循环(while for) 跳转 异常处理(try cath) 线程恢复

一个类加载和使用(变量和方法;特殊一点的就是前面加个静态修饰):

静态变量 存在于静态方法区 静态方法:静态方法区

方法被调用:被压入栈顶,结束则出栈

平时使用一个对象:都是先装载类再通过实例化对象使用对象

对象生成,涉及内存分配以及类加载的过程;

对象消亡:垃圾回收

具体看关键字:static 修饰的变量 静态区共享,共享在对象池环境意味着线程安全

然后就有解决线程安全的关键字volatile(主要使用可见性,原理是cpu的内存模型,从主存中获取而非二级三级缓存,cpu总线消息,确保了安全性;另外它还保证了有序性)

多线程环境使用synchronized 关键字 static修饰的锁的是类的class对象(xx.class),拓展非static修饰的则是对象实例(即其他对象)

类和对象:理解成类是生成对象实例的模板(个人观点),类:人类 类实例/对象实例 张三(个人)

方法递归调用:注意线程栈深度设置,以及线程栈大小 栈溢出

堆区:主要是内存泄漏和内存溢出问题 如ThreadLocal中使用的对象在使用完成后未移除(remove),弱引用导致的内存泄漏(ThreadLocalMap中Entry.key为null但value不会被释放导致) ,一些项目中会使用这种方式来进行数据交互,不用担心一般项目不会用

深入:内存泄漏是内存溢出的原因之一,内存泄漏更多的是不再持有对象的引用但对象无法回收

JVM参数优化:可以通过部分的调节参数来优化,常见的面试jvm性能优化也都主要是参数,不同的场景和环境不同所要调节的jvm参数也不一样

java学习之推荐书籍:深入JVM虚拟机 java高并发编程详解(汪文君)【多线程后续讲了解什么以及企业中的应用】

标签: #java数据范围怎么实现