前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM学习系列学习三

JVM学习系列学习三

原创
作者头像
凯哥Java
修改2019-07-03 17:50:25
4100
修改2019-07-03 17:50:25
举报
文章被收录于专栏:凯哥Java凯哥Java

我们接着上一篇文章讲解:

堆、栈、永久区比较

Heap(堆内存):

    在Java中,创建的所有引用对象类型,都在堆内存中。堆内存中的数据由GC对其进行管理的。其实堆内存也是GC主要管理的地方。

    如:释放不再被程序引用的对象所占用的内存

Stack(栈内存)

    栈内存与堆内存是相对的。栈内存存放的是基础数据类型。如:int、long等。是由程序的执行顺序控制变量的进出栈顺序,这里的数据不受GC管控的。

Perm(永久区)

    永久区是用于存储类的元数据。如:类的定义、方法定义(application metadata),用来描述类及方法的元数信息。

需要注意的是:永久区不是堆的一部分。

永久区的生命周期与JVM是绑定的;

堆内存的生命周期与程序绑定的。

内存管理优化参数:

-Xms

设置JVM启动时的堆内存(Heap)的大小

-Xmx     For setting the maximum heap size.

设置堆内存(Heap)的最大值

-Xmn

设置 Young Gen 内存区的大小

-XX:PermGen

设置 Perm Gen 内存的初始大小

-XX:MaxPermGen

设置 Perm Gen 内存的最大值

-XX:SurvivorRatio

设置 Eden Gen 与 S0 Gen,S1 Gen 内存的大小比。默认值:8

例如:

Young Gen 大小为 10M,

-XX:SurvivorRatio=2

则:

Eden Gen 的大小为 5,

S0 和 S1 的大小分别为 2.5

-XX:NewRatio

设置 Old Gen / Young Gen 的值。默认:2

大部分情况下,默认值不用调。

JDK1.8堆内存模型

从上图中我们可以看出,在JDK1.8的内存模型中是由2部分组成的:年轻代和年老代

年轻代:Eden+2*svrvivor

年老代:OldGen

1.8与1.7堆内存模型区别:

在1.8中最大的变化就是Perm区(年老区),用metaspace(元数据空)进行了替换。

这里需要特别强调的是:元数据区(metaspace)所占用的内存空间并非虚拟机内部的,而是直接在本地的内存空间中。这也是1.8与1.7永久代最大的区别所在。

在1.8之后为什么要废弃掉1,7中永久区呢?

官方给出的答案:

在实际使用中,永久区内存经常会出现不够用的情况或是发生内存泄漏,也就是抛出java.lang.OutOfMemoryError:PermGen的错误。基于这个原因,才改用使用本地内存空间。

本文是《JVM学习系列》中的第三篇文章。如果想系统的学习,建议从本教程第一篇开始看。

下节预告:

0f6c917e7484896b6f869d22531d778c.png
0f6c917e7484896b6f869d22531d778c.png

本文来源:www.kaigejava.com

公众号:凯哥Java

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档