首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Java 内存模型之堆内存(Heap)

1、什么是 Perm Gen? Perm Gen : Permanent Generation  Perm Gen 区是一个特殊的JVM内存区,因为它用来存储用来描述 Class 的  元数据(Class 可以不属于Java语言的一部分,也可以属于),诸如:描述类及其方法。  在大的应用中该区一会儿就满了,并抛出错误:java.lang.OutOfMemoryError: PermGen  然而无论你怎么设置 -Xmx 也不管用。  因为设置其大小的参数不是 -Xmx,而是 -XX:PermGen, -XX:MaxPermGen (不同Java版本略有变化)  2、Heap VS. Stack VS. Perm Heap(堆内存):  使用Java语言创建的所有的引用对象类型,都在此存储。并由 GC (Garbage Collection)对其进行管理,  诸如:释放不再被程序引用的对象所占据的内存。  Stack(栈内存):  与 Heap 相对的是,Stack 存放基础数据类型。诸如:int, char 等。  由程序的执行顺序控制变量的进出栈顺序,而不是由 GC 控制栈内存的管理。  Perm(持久内存):  用于存储类的元数据。诸如:类的定义,方法的定义等。  Perm 的生命周期与 JVM 绑定,而 Heap 的生命周期与程序绑定。  二、堆内存(Heap) 与 Garbage Collection 理解 GC (Garbage Collection),需要理解 Heap 。  JVM 的 Heap 堆内存在物理上被划分为两部分:Young Gen, Old Gen  1、 JVM 内存管理之:Young Gen 所有新创建的 Object 首先被放在 Young Generation 内存区。  如果 Young Generation 内存区满了,则执行 Garbage Collection 。这种 GC 称为 Minor GC。  Young Generation 区又分为三部分: Eden Memory,Survivor0 Memory (S0),Survivor1 Memory(S1).  Young Generation 内存区要点:  1、绝大多数新建的 Object 被放在 Eden Memory  2、如果 Eden Memory 内存满了,则进行 GC 操作。     同时把未被 GC 的 Object 移动到 S0 或 S1 中。     此时 Minor GC 也会检查和移动 S0 和 S1 中的对象。     最后使 S0,S1 其中一个置为空。  3、多次 GC 后仍然未被 GC 的 Object 将被移动到 Old Gen 内存区中。     通常 Object 会被 GC 设定一个轮询的阀值。  2、 JVM 内存管理之:Old Gen Old Gen 内存区存放了经过多次 Minor GC 后仍然不能被 GC 的 Object。  与 Young Gen 相同,当 Old Gen 区满了之后将执行 GC 操作,该操作称为:Major GC。  耗用的时间也相对较长。  stop-the-world 事件  Young Gen 和 Old Gen 都可以主动触发 stop-the-world 事件,挂起所有任务,执行 GC 操作。  被挂起的任务只有在 GC 执行完毕后,才会恢复执行。  多数情况下, GC 性能调优(GC tuning)就是指降低 stop-the-world 时 GC 执行的时间。  三、Perm Gen  JVM 在 Permanent Generation 或 Perm Gen 内存区中存放应用程序的元数据  (application metadata),用来描述类及其方法的原始信息。  注意:Perm Gen 不是 Heap 的一部分。  Perm Gen 被 JVM 使用于应用程序运行期间(runtime),基于应用所使用到的类。  Perm Gen 中同时包括 Java SE 包中的类。  Perm Gen 只有在执行 Full GC 时才会被 GC。  四、内存管理调优参数 -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  例如:  Yo

01

用acme.sh自动部署域名证书

目前使用量最大的免费SSL证书就是Let’s Encrypt,自2018-03开始,Let’s Encrypt官方发布上线了免费的SSL泛域名证书,目前通过DNS方式获取比较快,国内可以通过鹅云的DNSPod域名API或者猫云域名API自动签发Let’s Encrypt泛域名证书。因为鹅云使用的就是DNSPod域名,并且鹅云和DNSPod的账号是打通的,可以使用wx直接扫码登录。下文需要对鹅云和DNSPod进行操作,为了简化证书申请过程,需要提前安装acme.sh。acme.sh实现了acme协议,可以从Let’s Encrypt生成免费的证书,自动创建cron任务, 每天零点自动检测所有的证书,如果发现证书快过期了,需要更新,则acme.sh会自动更新证书,安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中。

02

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券