java gc free_java gc总结

gc主要工作于java堆(包含新生区Young Generation及年老区Old Generation),方法区(永久区Permanent Generation 1.7-)

堆主要放活动对象,其中:

新生区分为eden,to survivor, from survivor,大小默认为8:1:1

刚刚new的对象会放在新生区(其实是放eden),每次gc后还存活会将其存活计数器+1,当存活数达到15次左右,置入年老区。

方法区就比较复杂了,包括类加载器,常量池等等,主要是类的信息(即加载类时需要加载的信息,包括版本、域、方法、接口等信息),静态变量。

a.gc算法:

(1)复制算法(用于新生区):

eden,to survivor, from survivor这里简称a,b,c;回收过程如下

(a)对象不断地产生...放入a,活动区为a

(b)a满,根据root算法找出有用对象放入b(存货计数+1);清空a;活动区为a,b

(c)循环上一步,直到a,b都满

(d)对a,b都执行查找,将有用对象放入c;清空a,b;活动区为a,c

(e)这时每次a满,改为放c,a,c满,gc,然后改为使用a,b,如此类推。

复制算法适用于小量对象,因为复制会耗费相当的空间,复制后一并清除的做法好处是快速而不会产生碎片空间,通过不断切活动区保证内存区可用。

需要注意的是如果大对象放不下b或者c,直接放年老区;上面提到的存货计数达到一定程度也会移到年老区。

(2)标记-清扫算法(用于年老区,现在一般不用了):

找出所有不可达对象,并标记;标记完成后,一次性清除;会产生碎片空间,需要增加整理这一步。

(3)标记-整理算法(用于年老区,G1收集器以此为据):

可以说是上一算法的改进,先标记需要回收的对象,但是不会直接清理那些可回收的对象,

而是将存活对象向内存区域的一端移动,然后清理掉端以外的内存。

(4)gc一般不光顾永久区,故没有特别的算法,永久区的回收一般是:

(a)常量池中的常量,常量如果没有被引用则可以被回收

(b)无用的类信息(同时满足以下条件):

<1>类的所有实例都已经被回收了

<2>加载类的ClassLoader已经被回收

<3>类对象的class对象没有被引用(即没有通过反射引用该类的地方)

b.gc的步骤概念

Minor GC : 会清理年轻代的内存,主要是eden满触发

Major GC : 清理老年代,一般由Minor GC触发

Full GC  : 清理堆空间,如果Major GC没法解决,直接清理所有空间,如果还是无法分配空间,则报内存溢出

很多时候Full GC其实是执行了Minor GC+Major GC。

c.新版本jdk对方法区的更改

(1)1.8+取消了永久区Permanent Generation,改为元空间 Metaspace,两者都是对方法区的一种实现

元空间在本地内存,不在jvm内存中,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:

-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:

如果释放了大量的空间,就适当降低该值;

如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。

除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性:

-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集

-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

用法:java -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m class

(2)String常量池从永久代移到了堆中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
This error occurs when the Java Virtual Machine (JVM) is spending too much time on garbage collection (GC) and is unable to free up enough memory. When this happens, the JVM throws an OutOfMemoryError with the message "GC overhead limit exceeded". The GC overhead limit is a threshold that specifies the maximum percentage of time that the JVM can spend on garbage collection before it is considered excessive. By default, this limit is set to 98%, which means that if the JVM spends more than 98% of its time on garbage collection, it will throw an OutOfMemoryError. To resolve this issue, you can try one or more of the following: 1. Increase the heap size: This error can occur when the JVM is running out of memory. You can increase the heap size using the -Xmx option. For example, you can set the heap size to 2GB by adding the following to your command line: -Xmx2g. 2. Reduce the amount of memory used by your application: If your application is using too much memory, you can try reducing the amount of memory it uses. This can be done by optimizing your code, reducing the amount of data stored in memory, or using more efficient data structures. 3. Tune the garbage collector: You can tune the garbage collector to better suit your application's needs. This can be done by adjusting the GC algorithms, the heap size, and other parameters. 4. Use a profiler: You can use a profiler to identify memory leaks and other performance issues in your application. A profiler can help you identify which parts of your code are causing the JVM to spend too much time on garbage collection.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值