java永久代gc

弱弱的问一句 jvm full gc到底是啥意思

JVM 内置的通用垃圾回收原则,堆内存划分为 Eden、Survivor 和 Tenured/Old 空间。GC一共分三种:MinorGC,Major GC v和Full GC。Full GC是清理整个堆空间—包括年轻代和永久代。有时候系统会频繁的FullGC,这时候需要去服务器查一下原因。

当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类  ,通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用。

扩展资料

触发Full GC执行的情况有如下四种。旧生代空间不足

1.旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:

java.lang.OutOfMemoryError: Java heap space

为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在Minor GC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

2. Permanet Generation空间满

PermanetGeneration中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:

java.lang.OutOfMemoryError: PermGen space

为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。

3. CMS GC时出现promotion failed和concurrent mode failure

对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。

promotionfailed是在进行Minor GC时,survivor space放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入旧生代,而此时旧生代空间不足造成的。

应对措施为:增大survivorspace、旧生代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作。对于这种状况,可通过设置-XX:CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。

4. 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间

这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。

例如程序第一次触发MinorGC后,有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。

当新生代采用PSGC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。

除了以上4种状况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC。可通过在启动时通过- java-Dsun.rmi.dgc.client.gcInterval=3600000来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

参考资料来源:百度百科-JAVA

java永久代gc

JDK命令介绍

命令jps用于列出java进程,直接运行jps不加任何参数,可以列出Java程序的进程ID以及Main函数等名称。

参数-q指定jps只输出进程ID,而不输出类的短名称

参数-m用于输出传递给Java进程(主函数)的参数

参数 -l用于输出主函数的完整路径

参数 -v可以显示传递给JVM的参数

jstat是一个可以用于观察Java应用程序运行时信息的工具。它的功能非常强大,可以通过它,查看堆信息的详细使用情况。主要用于监控虚拟机的各种运行状态信息,如类的装载、内存、垃圾回收、JIT编译器等,在没有GUI的服务器上,这款工具是首选的一款监控工具。

基本使用语法为:

选项option可以由以下值构成:

-class:显示ClassLoader的相关信息。

-compiler:显示JIT编译的相关信息。

-gc:显示与GC相关的堆信息。

-gccapacity:显示各个代的容量及使用情况。

-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因。

-gcnew:显示新生代信息。

-gcnewcapacity:显示新生代大小与使用情况。

-gcold:显示老年代与永久代的信息。

-gcoldcapacity:显示老年代的大小。

-gcmetacapacity:显示元空间的大小。(在java8之前是使用-gcpermcapacity显示永久代的大小)

-gcutil:显示垃圾收集信息。

-printcompilation:输出JIT编译的方法信息。

以上选项可以输入 jstat -options 查看。

-t 参数可以在输出信息前加一个 Timestamp 列,显示程序的运行时间。

-h 参数可以在周期性数据输出时,输出多少行数据后,跟着输出一个表头信息。

vmid 参数就是Java进程id。

interval 参数用于指定输出统计数据的周期,单位为毫秒。

count 用于指定一共输出多少次数据。

jinfo 可以用来查看正在运行的Java运行程序的扩展参数,甚至支持在运行时修改部分参数。可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。

jmap 可以生成Java应用程序的堆快照和对象的统计信息。基本语法为:

option 选项如下:

-dump 生成java堆转储快照。格式为: -dump:[live,]format=b,file=,其中live子参数说明是否只dump出存活的对象

-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效

-heap 显示java堆详细信息,如使用哪种收集器、参数配置、分代情况等,在Linux/Solaris平台下有效

-histo 显示堆中对象统计信息,包含类、实例对象、合集容量

-permstat 以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效

-F 当虚拟机进程对-dump选项没有相应时。可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效

使用 jhat 工具可以用于分析Java应用程序的堆快照内容。jhat 在分析完成后,使用HTTP服务器展示其分析结果。在浏览器中访问

jstack 可用于导出Java应用程序的线程堆栈。语法为:

-l选项用于打印锁的附加信息。

jstack 工具会在控制台输出程序中所有的锁信息,可以使用重定向将输出保存到文件。

通过 jstack 工具不仅可以得到线程堆栈,它还能自动进行死锁检查,输出找到的死锁信息。

之前所述的工具中,只涉及到监控本机的Java应用程序。而在这些工具中,一些监控工具也支持对远程计算机的监控(如:jps、jstat)。为了启用远程监控,则需要配合使用jstatd工具。

命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本机的Java应用程序信息传递到远程计算机。

JConsole(Java Monitoring and ManagementConsole)工具时JDK自带的图形化性能监控工具。通过JConsole工具,可以查看Java应用程序的运行概况,监控堆信息、永久区使用情况、类加载情况等。

Java垃圾回收:GC在什么时候对什么做了什么

1、首先,GC又分为minor GC 和 Full GC(major GC)。Java堆内存分为新生代和老年代,新生代中又分为1个eden区和两个Survior区域。

2、一般情况下,新创建的对象都会被分配到eden区,这些对象经过一个minor gc后仍然存活将会被移动到Survior区域中,对象在Survior中没熬过一个Minor GC,年龄就会增加一岁,当他的年龄到达一定程度时,就会被移动到老年代中。

3、当eden区满时,还存活的对象将被复制到survior区,当一个survior区满时,此区域的存活对象将被复制到另外一个survior区,当另外一个也满了的时候,从前一个Survior区复制过来的并且此时还存活的对象,将可能被复制到老年代。因为年轻代中的对象基本都是朝生夕死(80%以上),所以年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想是将内存分为两块,每次只有其中一块,当这一块内存使用完,就将还活着的对象复制到另一块上面。复制算法不会产生内存碎片。

4、在GC开始的时候,对象只会存在于eden区,和名为“From”的Survior区,Survior区“to”是空的。紧接着GCeden区中所有存活的对象都会被复制到“To”,而在from区中,仍存活的对象会根据他们的年龄值来决定去向,年龄到达一定只的对象会被复制到老年代,没有到达的对象会被复制到to survior中,经过这次gc后,eden区和fromsurvior区已经被清空。这个时候,from和to会交换他们的角色,也就是新的to就是上次GC前的fromMinor GC:从年轻代回收内存。

5、当jvm无法为一个新的对象分配空间时会触发Minor GC,比如当Eden区满了。当内存池被填满的时候,其中的内容全部会被复制,指针会从0开始跟踪空闲内存。Eden和Survior区不存在内存碎片写指针总是停留在所使用内存池的顶部。执行minor操作时不会影响到永久代,从永久带到年轻代的引用被当成GC roots,从年轻代到永久代的引用在标记阶段被直接忽略掉(永久代用来存放java的类信息)。如果eden区域中大部分对象被认为是垃圾,永远也不会复制到Survior区域或者老年代空间。如果正好相反,eden区域大部分新生对象不符合GC条件,Minor GC执行时暂停的线程时间将会长很多。Minor may call “stop the world”。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月27日 22:32:44
下一篇 2024年3月27日 22:40:02

相关推荐

  • 复兴中文破解java,复兴的中文

    手机Java游戏要怎么汉化啊?? 关闭设置界面,重新启动游戏,即可看到中文界面。如果您的Minecraft游戏没有中文语言包,可以在Minecraft官网上下载中文语言包并安装。在安装后按照以上步骤选择中文语言即可。 文字汉化 运行AndroidResEdit软件, 打开之前解压出来的resources.arsc文件。 汉化手机游戏,那得看看有没有手机软件了…

    2024年5月20日
    3100
  • java卡开发,javacard开发

    Java开发页面不定时卡死是什么问题?怎么决解? 1、)如果一启动,就卡死;那可能是这个软件和你电脑环境不兼容;试着更新一下系统JDK;2)如果是进行了一些下载、读取信息之类的操作:可能和网络或者服务器本身的问题;具体还是要看什么软件,什么情况下出现的问题。 2、可能是你每次申请的连续内存,你的空余内存可能大于750m。在编写java程序之前,要为电脑安装j…

    2024年5月20日
    4000
  • java导出类,Java导出类图

    java将数据导出excel计算其文件大小 1、javabean属性【数据类型有java基本数据类型及String,Date,byte[](图片转成字节码)】 * @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 * @param pattern 如果有时间数据,设定输出格式。 2、在编程中经常需要使用到表格(报表)…

    2024年5月20日
    3400
  • java引入数学计算,java如何进行数学计算

    java定义一个实现常用数学运算的类MyMath }//四个普通方法public void max(){};…}之后在另一个主类的main方法中,new一个MyMath类,调用方法。 Math类是Java点的编程工具类提供了许多数学计算相关的方法。下面是Math类中常用的方法及其解释:abs(double a):返回参数的绝对值。ceil(dou…

    2024年5月20日
    3400
  • java如何获取json数据,java 读取 json

    java怎么得到json中的数据 1、在Java中,可以使用Jackson库将Java对象转换为JSON格式。 2、你好,Java读取json数据格式,你只需要使用JsonStore 等等工具包即可进行便捷的读取了。代码比较简单,通俗易懂,具体JsonStore可以百度一下详细信息。 3、jsonobj); //可以将json对象转换成json对符串 的第二…

    2024年5月20日
    3800
  • 配置java环境变量无效,配置java环境变量无效怎么解决

    为什么每次重启电脑后之前配置好的java环境变量都会失效,必须重新配置… 检查环境变量是否正确设置:打开“控制面板”-“系统和安全”-“系统”-“高级系统设置”-“环境变量”,确认环境变量是否正确设置。 你的环境变量配置的有问题,你重新配置一下,我也一直用的都是1的,一年多了。 你的JAVA_HOME环境变量设置不对,如上图;另外还需要设置一下c…

    2024年5月20日
    3500
  • java上传图片命名,java上传图片到文件服务器

    java实现文件批量上传是否需要将文件重命名(包括图片,word文档,录音… 只需要改动几个地方而已即可。首先是上传页面,由于要上传多个文件,所以就必须有多个供用户选择的文件框,然后修改Action,把action中属性的类型修改为list。 概述在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 (http://)为 http…

    2024年5月20日
    3500
  • java初始化static变量,java怎样初始化变量

    java类中的静态变量是什么时候初始化的 1、静态初始化块:当类第一次加载时执行。非静态初始化块:非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被执行。区别如下:执行次数不同 静态块只执行一次,初始化块可以执行多次。 2、静态方法是你手动调用的时候执行。静态变量与类一起加载,最优先的。然后是,静态初始化器(只初始化静态成员变量)。然后是,属性…

    2024年5月20日
    3700
  • java超卖,java编程超市打折

    上海哪里有周末java培训班 1、上海java培训机构【达内教育】的最可靠,【达内教育】是引领行业的职业教育公司,致力于面向IT互联网行业培养人才,达内大型T专场招聘会每年定期举行,为学员搭建快捷高效的双选绿色通道。 2、各地各式各样的Java培训班有很多。不过业余学习培训Java开发的,能教的好的那真是少。 3、Java培训推荐选择【达内教育】,达内“因材…

    2024年5月20日
    3400
  • java动态代理视频,java动态代理使用

    JAVA动态代理解析 1、OverviewJava在java.lang.reflect包下,定义了自己的代理。利用这个包下的类,我们可以在运行时动态地创建一个代理类,实现一个或多个接口。并将方法的调用转发到你所指定的类。 2、这句话的意思是,在Java中,动态代理(java.lang.reflect.Proxy)主要用于在编译时无法确定要实现的接口或者需要在…

    2024年5月20日
    3400

发表回复

登录后才能评论



关注微信