走进java 的大千世界(运行时数据区域)

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


走进java 的大千世界(运行时数据区域)

1、Java的特色

1.1、概述:

由一系列计算机软件和规范组成的技术体系。


1.2、JAVA语音优点:

 (1) 摆脱了硬件平台的束缚,实现了"一次编写,到处运行"的理想。

 (2)JAVA技术体系提供了一个相对安全的内存管理和访问机制,避免了大多数内存溢出和指针越界

扩展:

java严格来说就不存在内存泄漏,所谓的内存泄漏一般2种情况:

  1. 代码bug,本该释放的引用一直持有,导致内存占用越来越多。
  2. tps (每秒传输的事物处理个数),即服务器每秒处理的事务数 太高,jvm gc释放内存的速度赶不上申请的速度。

一般来说情况2大多也是bug引起的,一般不会申请那么快那么多。
严格来说内存泄漏是那些没有自动GC机制的语言特有的现象,当然是bug。

 (3)JAVA技术体系实现了热点代码检测和运行时编译及优化,这保证了java应用运行的时间越长,而获得更高的性能。

java技术体系中目前特点(Hotspot VM虚拟机): 需要预热才能达到最高性能。

 (4)[最主要一点] java技术体系已经吸引了600多万软件开发者,是全球最大的开发团队,因此除了自有的一套完善的应用程序接口外,还有无数来自商业机构和开源社区的第三方类库来帮助用户实现各种各样的功能。


1.3、java技术体系包含

 (1)、java程序设计语言
 (2)、各种硬件平台上的java虚拟机实现
 (3)、class文件格式
 (4)、java类库API
 (5)、来自商业机构和开源社区组成的第三方类库Api

JDK : 代指整个java技术体系
JRE : java类库中的 java SE 子集 api 和 java虚拟机 两部分
jre是jdk 的子集


2、java 内存区域

2.1、运行时数据区域

概述:
 java VM 会在【java应用】的执行过程中,把它所管理的内存划分为若干个不同的数据区域,如下:

java VM 运行时数据区:

在这里插入图片描述
粉色的区域】是依赖用户线程的启动和结束而建立和销毁的。
黄色的区域】是随着虚拟机进程的启动而一直存在的。

2.1.1、线程私有(运行时数据区域)

(1)程序计数器

概念:

 程序计数器是一块较小的【内存空间】,是当前线程所执行的字节码的【行号】指示器。

作用:

 在每条线程中,都需要有一个程序计数器,他们在各个线程中都是独立存储,互不影响,并且通过 改变这个计数器的值来选取下一条需要执行的字节码的指令。

(2)java虚拟机栈(生命周期与线程相同)

概念:

 在java方法所执行的【线程内存模型】中,【每个方法】被执行的时候,java虚拟机栈同步创建一个【栈帧】, 用于存储【局部变量表,操作数栈,动态链接,方法出口等信息】

特点:

 每个方法被调用至执行完毕的过程,对应着一个【栈帧】在虚拟机栈中从入栈到出栈的过程。

异常状况:

a.StackOverflowError异常:
如果线程请求的深度大于虚拟机规范所允许的深度时,抛出。
b.OutOfMemoryError异常:
如果java虚拟机栈容量可扩展,当栈扩展时无法申请到足够的内存时,抛出。

2.1.2、线程共享(运行时数据区域)

(1)java堆(内存中最大的一块)

概念:

 虚拟机启动时创建,唯一目的存放对象实例【几乎所有的对象实例以及数组都应当在堆上分配】
:几乎的原因是因为随着以后java语音的发展,还有现在即时编译的进步,所有的实例都在堆上分配这一原则变得不是那么绝对的了。

特点:

 java堆既可以实现成固定大小,也可以是可扩展的【通过参数 -Xmx和-Xms设定】

异常状况:

a.OutOfMemoryError异常:
当java堆中没有内存完成实例分配,并且堆也无法在扩展时,抛出。

(2)方法区

概念:

 各个线程共享的内存区域,同于存放被虚拟机加载的类型信息,常量,静态变量,即时编译后的代码缓存等数据。

回收目标:
  a. 针对常量池的回收
  b.对类型的卸载

在这里插入图片描述
运行时常量池:

扩展一下::常量池可以理解为class文件中的资源仓库,它是class文件结构中与其他项目关联最多的数据类型,也是占用class文件空间最大的数据项目之一,同时它还是在class文件中第一个出现的表类型数据项目。

Class文件中除了类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译器生成的各种字面量与符号引用,这 部分内容将在类加载后存放到方法区的运行时常量池中。

2.1.3、特殊部位

(1)本地方法栈

概念:

 本地方法栈发挥的作用和java虚拟机栈非常相似,区别在于,本地方法栈是为虚拟机用到的本地(Native)方法服务的

(2)直接内存

概念:

 堆外内存,并非虚拟机数据区的一部分,可以分配的,大小受本机内存限制,与堆区相比,IO读写性能要优于堆区,频繁申请更耗费性能

堆内外内存比较:

 直接内存的IO访问效率要高于非直接内存的访问效率

原因:

 本地IO会直接操作直接内存,而非直接内存的话,会比直接内存多操作一步,堆内存copy到直接内存这步。

Guess you like

Origin blog.csdn.net/weixin_38316697/article/details/109025890