下面有关JVM内存,说法错误的是?

1、程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
2、Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
3、方法区用于存储JVM加载的类信息、常量、静态变量、即使编译器编译后的代码等数据,是线程隔离的
4、原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的
 
首先要回答这个问题,那么就要清楚jvm中内存是长什么样子的。
我遇到这个问题的时候,也只是简单的了解,因为没有做过什么对于java性能的优化,所以对于JVM不是很了解,所以还是要熟悉一下。
 
首先看一张图
 
这张图简单表示了jvm的内存是长什么样子的。
 
首先是颜色上面,蓝绿色的是非线程共享的,而黄色的是线程共享的。
然后是大小,大的我们用的多,而且需要掌握,小的我们只需了解,用的不是特别多。
 
我们先解释简单的
程序计数器。
其实这个东西很好理解,这个东西就相当于一个箭头,就和你断点调试的箭头一样,程序走到哪一步,他就到了那里。
他的功能就是用来告诉虚拟机现在走到了第几行代码了。然后你仔细想一下,这个箭头肯定是不能线程共享的,为什么呢?
每一个类都有每一个类的方法,多个用户肯定有可能会调用多个方法,每个方法有每个方法执行的的顺序,时间,所以一个人来了肯定会重新分配一个,大家不可能都用一个。
 
本地方法栈。
这货也好理解,你就把他当做栈,它里面呢,就是运行一些系统本地方法是需要用的。本地方法栈为使用到的本地操作系统(Native)方法服务。
 
 
还有三个就是重点了。
 
要理解,就要new对象了。
让我们来从new对象的执行顺序来理解这三个东西。
 
首先一个类在被jvm的类加载器加载的时候,它会把这个类的信息、常量、静态变量、编译器编译后的代码等数据存放到方法区里面去。还有静态变量也会存进去。常量存到常量池里面去。也就是说。方法区就像一个图书馆,把那些加载好的东西都存起来,等着备用。
 
然后一个类被new的时候,首先会在方法区中找这个类,找到一模一样的,然后在堆里面新建一个,然后先对一些变量初始化。基本变量赋值,对象赋值null。该对象的方法,会指向方法区中这个对象方法的地址。也就是说,多个相同的对象在堆中是保存了方法的地址,而没有把方法再复制一遍。
 
最后是一个对象被赋值的时候,注意刚才只是new A();而不是A a = new A();现在才是。当这一步的时候,会在java栈中建一个名字叫a的东西,然后把它的地址写成A在堆中的地址。
 
其实呢,栈里面还有很细的东西,它的内部结构是
 
但是我们可能不需要了解那么深入,有兴趣的同学自己去看呗。这里简单理解就好。
 
 

然后来理解选项

1、程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
2、Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
3、方法区用于存储JVM加载的类信息、常量、静态变量、即使编译器编译后的代码等数据,是线程隔离的
4、原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的
 

1、前面已经说过了,这边不多说。

2、中Java方法执行内存模型,其实就是java栈,看上面的内部结构,前半部分就是对的。那么后半部分呢?

每一个用户过来,都是一个线程,每一个线程都需要有方法执行的顺序,那么都需要一个栈。所以不是线程共享的。

3、方法区加载的那些信息肯定是对的,但是对于方法区来说,并不是每个线程过来都用用一个新的方法区,因为之前说过它就是一个图书馆,堆只要往里面拿就好了,而且编译加载之后方法区里面已经有东西了,而且那些方法,常量都是可以复用的,所以方法区肯定是共享的.

4、对象都是在堆中new出来的,为什么是线程共享的呢,线程共享的区域与JAVA程序运行的生命周期相同。这部分空间是Java垃圾收集器管理的主要区域。这些对象都是由GC管理回收的。所以是线程共享的。

下面是参考资料:如果想仔细了解的同学看下面的,别看我的。

http://www.cnblogs.com/dolphin0520/p/3613043.html

http://blog.csdn.net/ns_code/article/details/17565503

http://www.cnblogs.com/sunada2005/p/3577799.html

你需要简单了解JVM中的内存长什么样子相关推荐

  1. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

  2. 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    大家好,我是bin,又到了每周我们见面的时刻了,我在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐 ...

  3. 7、Java 对象在 JVM 中的内存布局(详细说明)

    文章目录 一.new 对象的几种说法 二.Java 对象在内存中的存在形式 1. 栈帧(Frame) 2. 对象在内存中的存在形式 ① 3. 对象中的方法存储在那儿? 4. Java 对象在内存中的存 ...

  4. JVM中的本地内存追踪NMT(Native Memory Tracking)

    JVM中的本地内存追踪NMT(Native Memory Tracking) 1 概述 每当想起为什么Java应用程序会消耗比设置-Xms和-Xmx多的内存的时候,心中总是会有个问号.因为一些理由和优 ...

  5. JVM中的Stack和Heap1

    2019独角兽企业重金招聘Python工程师标准>>> 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Hea ...

  6. 深入Java虚拟机:JVM中的Stack和Heap

    http://www.cnblogs.com/laoyangHJ/archive/2011/08/17/gc-Stack.html 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里 ...

  7. new arraylist内存_如何避免内部类中的内存泄漏

    我先假设读者已经熟悉在Java代码中使用嵌套类的基础知识.在本文里,我将展示嵌套类的陷阱,内部类在JVM中引起内存泄漏和内存不足错误的地方.之所以会发生这种类型的内存泄漏,是因为内部类必须始终能够访问 ...

  8. java final 内存泄漏_干货详解:一文教你如何避免内部类中的内存泄漏

    我先假设读者已经熟悉在Java代码中使用嵌套类的基础知识.在本文里,我将展示嵌套类的陷阱,内部类在JVM中引起内存泄漏和内存不足错误的地方.之所以会发生这种类型的内存泄漏,是因为内部类必须始终能够访问 ...

  9. jvm堆外内存--DirectByteBuffer

    jvm的堆外内存本来是高贵而神秘的东西,只在一些缓存方案实战级别才会出现.但自从用了Netty等高并发IO框架后,就变成了天天与堆外内存打交道,在mina,netty等nio框架中屡见不鲜.堆外内存的 ...

最新文章

  1. 华为鸿蒙系统2.0发布了!AI人工智能大有可为!
  2. WebSocket的C++服务器端实现
  3. [转]COM对象创建-外部机制
  4. 让所有连接都弹出新窗口
  5. 我的天!你竟然没有在SpringBoot中使用过异步请求和异步调用...
  6. 【hdu3183】A Magic Lamp(思维+st表(含模版))
  7. linux+开机启动sshd_Linux sshd服务自动启动
  8. AI语音红外遥控配网教程
  9. android 连笔记本无线上网,android手机通过笔记本的网络实现无线wifi上网
  10. TrinityCore魔兽世界服务器-环境搭建(Debian11)
  11. 内定抽奖小程序_微信抽奖助手怎么中奖 无需作弊照样中奖
  12. Linux-磁盘扩容(逻辑卷方式)
  13. 做UI设计需要具备什么技能
  14. 拿铁DHT-PHEV座舱智能程度体验笔记(超详细)
  15. 使用Apache Spark SQL探索标普500和石油价格
  16. 022 PHP获取从周一到周日的时间戳
  17. 2018 UESTC Training for Data Structures 小埋的steam愿望单
  18. python timedelta 求时间差省去繁琐格式转换
  19. 企业微信 php回调模式,老师,我的是微信企业号,开启回调模式一直不行,总提示 请求该url失败...
  20. gdb 调试+子进程+线程

热门文章

  1. python 字符串转函数名_Python 使用函数名(字符串)调用函数(4种方法)
  2. netty 使用阻塞发送_大数据、分布式都用到了的Netty,这几大核心知识你一定要看看!...
  3. python和matlab的区别_我为什么选择Python,不是Matlab和R语言呢?
  4. 织梦网站调用变量失败_(自适应手机版)响应式精密机械模具类网站织梦模板 织梦仪器模具加工设备网站模板下载...
  5. spring freemarker 获取后端的值
  6. 不能使用 float 和 double 来表示金额等精确的值
  7. 查询计算机系的所有教师,用sql查询所有计算机系的教师编号和姓名
  8. 计算机原理华东理工大学期末成绩查询,华东理工大学微机原理历年真题第十一章.ppt...
  9. icmp基于tcp还是udp_imi -- 基于PHP协程应用开发框架,支持WebSocket,TCP,UDP应用开发...
  10. python123第九周测验答案2020_脑筋急转弯:什么牛是最好骗的?这答案能笑死人...