linux系统网站空间,网站商业授权,软文标题和内容,微信小程序开发制作平台JVM是什么
Java Virtual Machine Java程序的运行环境#xff08;java二进制字节码的运行环境#xff09; 运行流程 什么是程序计数器#xff1f; 程序计数器#xff1a;线程私有的#xff0c;内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。
我们知道ja…
JVM是什么
Java Virtual Machine Java程序的运行环境java二进制字节码的运行环境 运行流程 什么是程序计数器 程序计数器线程私有的内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。
我们知道java代码想要运行需要先把java的源码编译为class字节码文件在字节码文件当中详细说明了代码的执行过程 Java堆
线程共享的区域主要用来保存对象实例数组等当堆中没有内存空间可分配给实例也无法再扩展时则抛出OutOfMemoryError异常。 在jdk8之后方法区/永久代被放到了本地内存中也叫做元空间 为什么方法区要放到本地内存呢
因为元空间或者说方法区主要存储的就是一些类或者常量项目随着动态类加载的情况越来越多这块内存变得越来越不可控。内存小了会容易出现内存溢出大了的话又会浪费内存。所以将方法区要放到本地内存可以防止堆空间内存溢出
总结 什么是虚拟机栈 垃圾回收是否涉及栈内存
垃圾回收主要指就是堆内存当栈帧弹栈以后内存就会释放
栈内存分配越大越好吗
未必默认的栈内存通常为1024k
栈帧过大会导致线程数变少例如机器总内存为512m目前能活动的线程数则为512个如果把栈内存改为2048k那么能活动的栈帧就会减半
方法内的局部变量是否线程安全
如果方法内局部变量没有逃离方法的作用范围它是线程安全的
如果是局部变量引用了对象并逃离方法的作用范围需要考虑线程安全 什么时候会出现栈内存溢出 总结 堆栈的区别是什么
栈内存一般会用来存储局部变量和方法调用但堆内存是用来存储Java对象和数组的的。堆会GC垃圾回收而栈不会。
栈内存是线程私有的而堆内存是线程共有的。
两者异常错误不同但如果栈内存或者堆内存不足都会抛出异常。 栈空间不足java.lang.StackOverFlowError。 堆空间不足java.lang.OutOfMemoryError。
能不能解释一下方法区
方法区(Method Area)是各个线程共享的内存区域这点和堆一样
主要存储类的信息、运行时常量池
虚拟机启动的时候创建关闭虚拟机时释放
如果方法区域中的内存无法满足分配请求则会抛出OutOfMemoryError: Metaspace 常量池 运行时常量池 总结 直接内存
直接内存操作系统内存并不属于JVM中的内存结构不由JVM进行管理。是虚拟机的系统内存常见于 NIO 操作时用于数据缓冲区它分配回收成本较高但读写性能高
我们平常的io操作就是bio 常规IO的数据拷贝流程
首先我们知道java并不具备磁盘读写的能力他必须调用操作系统提供的函数这里就会调用本地方法native修饰来操作磁盘文件
当用户态转变为内核态这时候就会由cpu的函数区读取磁盘中的文件读取进来然后会在操作系统中划出一块缓冲区叫做系统缓冲区。利用缓冲区进行分批次的读取但是这块缓冲区java代码是没法运行的这是会在堆中划分一块java缓冲区。
这时候就进行到了下一个阶段调用输出流的写入操作进行反复读写就可以复制到一个目标的位置。但是因为有两块缓冲区可能会造成不必要的数据的复制因此效率不高 NIO数据拷贝流程
与上面不同多了一块直接内存无论是操作系统还是java代码都可以进行访问 总结