JVM(一)内存空间分配

什么是JVM内存?

一般java文件被编译成.class文件之后,会由类加载器加载进内存中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。

JDK8的内存空间大概有以下几部分
在这里插入图片描述
jdk7以后字符串常量池就由方法区移到了堆中

首先方法区:方法区是线程共享的区域,它一般用于储存与类相关的信息,像编译后的代码、静态变量等等,在jdk1.7中它的实现就是放入永久代中,这样的好处就是可以直接使用堆中的GC算法来进行管理,但坏处就是经常会出现内存溢出,即PermGen Space异常。在jdk8中,使用上图的metaspace代替,也就是元空间。元空间使用本地内存,理论上电脑有多少内存,它就有多少内存,避免的内存溢出问题

:它也是线程共享的,一般堆内存空间比它们内存空间要大,它主要负责存放对象实例。所以gc主要负责这块区域的垃圾回收。

程序计数器:是每个线程都具有一个私有的程序计数器,因为JVM执行代码是一行一行的执行,所以需要计数器来记录当前执行的行数

虚拟机栈:每个方法在执行的同时都会创建一个栈帧,用来存放局部变量,对象的引用之类的方法信息

本地方法栈:和虚拟机栈的作用相似,不过是针对native方法,一般可不用关心。

说一下元空间与永久代,相比的优势,在jdk8中元空间彻底取代永久代
1.字符串常量池在永久代中容易出现性能问题和内存溢出,而元空间使用本地内存,所以不用担心这个问题。
2.永久代会给gc带来不必要的复杂性
3.类和方法信息大小难以确定,给永久代的大小指定带来困难

java内存模型中堆栈的一些区别?
1.栈自动释放空间,堆需要gc回收
2.栈要对堆占用空间小很多
3.栈产生的碎片远小于堆
4.栈支持静态分配和动态分配,而堆只支持动态分配
5.栈的效率要高于堆

内存分配策略
Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配
静态分配:编译时确定每个数据目标在运行时的存储空间需求
栈式分配:数据区需求在编译时未知,运行时模块入口前确定
堆式分配:编译时或运行时模块入口都无法确定,是动态分配

JVM的三大性能调优参数
-Xss:规定每个线程虚拟栈的大小,一般情况下,256k足够,它会影响进程中线程的并发数量
-Xms:堆的初始值,
-Xmx:堆能达到的最大值,一旦对象超过-Xms指定的大小,就将堆扩容至此参数。但是为了防止heap扩容引起的内存抖动,影响程序运行的稳定性,所以一般设置为-xms一样的值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值