GC垃圾收集器&JVM调优汇总

JVM调优(二)Arthas的使用&jvm参数大小如何分配 Arthas官方文档 先下载Arthas的jar包 curl -O https://arthas.aliyun.com/arthas-boot.jar 执行命令 java -jar arthas-boot.jar 执行下面程序 public class HeapTest { public static void main(String[] args) throws InterruptedException { ArrayList list = new ArrayList() 阅读详情

最近朋友小B说想一份GC优化的资料内容,JVM内存分析以及性能调优的时候方便查询。可是文章太多根本看不过来,那么今天指北君就为大家带来这份,GC垃圾收集器总结及其优化指南,让你的JVM从此不再寂寞。

PS:最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,我连日加班好多天,终于整理好了,16000+ 道,295多份,多份面试题大全,我会持续更新中,马上就会整理更多!【文末有领取方式】

1 垃圾收集器

1.1 Serial/Serial Old 收集器:

Serial 收集器作用于年轻代中, 采用 复制算法 , 属于串行回收方式

Serial Old 收集器 采用串行回收, STW机制, 采用 标记-压缩 算法 ,

"-XX:+UseSerialGC" 手动指定Serial收集器执行内存回收任务

“-XX:+PrintGCDetails” 年轻代串行收集器的工作日志开关

1.2 ParNew 收集器

ParnNew 可以说是Serial收集器的多线程版本, ParNew 收集器在 年轻代 中同样才用的也是复制算法 和 STW  机制  并行回收机制。

ParnNew 收集器的优势体现在多CPU,多核心的环境中,   在某些注重低延迟的应用场景下ParNew 和 CMS 收集器的组合模式, 在Server 模式下的内存回收效果很好。

使用 “-XX:+UserParNewGC” 手动指定使用ParNew收集器 "

-XX:+UserParallelGC" 表示 年轻代使用并行垃圾回收器, 老年代使用串行收集器

1.3 Parallel/Parallel Old 收集器

Parallel收集器是并行回收 采用复制算法 年轻代 STW , 和ParNew不同Parrllel收集器可以控制程序的吞吐量大小 ,  被称为-吞吐量优先的垃圾收集器.

Parallel Old采用标记整理算法,用于老年代的垃圾回收。

常用参数:

“-XX:+GCTimeRatio:N” 设置执行内存回收的时间所占JVM运行总时间的比例, 1/(1+N) 默认N为99

“-XX:+MaxGCPauseMills” 设置执行内存回收STW 的暂停时间阈值, 若指定该值,则尽可能地在设定的时间内完成内存回收。

“-XX:+UseAdaptiveSizePolicy” 选项用于设置GC的自动分代大小调节策略。

"-XX:UseParallelOldGC"可在年轻代和老年代都是用并行回收收集器, 此收集器重点关注吞吐量

“-XX:ParallelGCThreads” 可用于设置垃圾回收时的线程数量

Parallel Old 收集器采用了 标记-压缩算法 , 用于老年代垃圾回收 , 并行回收 STW

Parallel 和 Parallel Old 收集器的组合 在Server 模式下的内存回收性能较好。

1.4 CMS(Concurrent-Mark-Sweep) 收集器

基于低延迟的考虑  , 是并行垃圾回收器, 而且是老年代垃圾收集, 低延迟, 采用标记清除算法。会有短暂的STW

基本步骤如下 :

1. 初始标记(Initial Mark) :STW 标记根对象直接关联、可达的对象  
2. 并发标记(Concurrent Mark) :将不可达对象 标记为垃圾对象 
3. 再次标记(Remark) :STW 确保垃圾对象被成功且正确得标记  
4. 并发清除(Concurrent Sweep):垃圾回收

常用参数:

“-XX:+UseCMS-CompactAtFullCollection” 用于指定在执行完FullGC 之后 是否对内存空间进行压缩整理,

“-XX:+CMSFullGCs-BeforeCompaction” 设定在执行多少次FullGC 之后对内存空间进行压缩整理

“-XX:+CMSInitiatingOccupanyFraction” 设置老年代中的内存使用率达到多少百分比的时候执行内存回收 JDK1.6之前默认值为68% JDK1.6 之后默认92%  , CMS垃圾收集器在回收过程中程依然可能会产生垃圾,所以需要设定一个阈值来进行垃圾回收,如果CMS回收失败,JVM则会启动老年代串行收集器进行垃圾回收,程序的STW时间会较长, 所以可以在内存增长缓慢的程序里面设置较大阈值,在内存增长快速的程序里面设置较小的阈值, 避免触发老年代串行收集器。

“-XX:UseConMarkSweepGC” 表示年轻代使用并行收集器,老年代使用CMS  年轻代  并行收集器工作时的线程数量可以使用 “-XX:ParallelGCThreads” 选项指定,  一般最好与CPU的数量相当.

1.5 G1(Garbage-First) 收集器

G1将整个堆划分为若干个大小相等的区间(1-32MB),Region类型分为Unused Region、Eden Region 和 Survivor Region组成了年轻代空间,Old Region, Humongous Region(里面的对象超过每个Region的50%),

每个Region都会有一个Region Set (RS),RS的数据结构是Hash表,里面的数据是CardTable (堆中没512Byte 映射在 card table 1 byte ) , 简单说 RS 里面存的是Region种存活对象的指针。当Region中数据发生变化的时候 ,首先反映到Card Table 中的一个或者对个card上,RS通过扫面内部的Card Table 得知Region中内存使用情况和存活对象,在使用Region过程中,如果一个Region被填满了,分配内存的线程会重新选择一个新的Region,空闲Region被组织到一个基于链表的数据结构(LinkedList )中,这样可以快速找到Region.

G1 GC 可以分为 Young GC 和Mixed GC

年轻代GC:当年轻代达到一定的阈值,就开始年轻代的并发收集。将Eden Region中存活对象copy转移到Survivor的Region中,同时释放Eden Region 。存活的时间够久就移到Old Reagion。

Mixed GC:当Old Region占比达到一定的比例(通过 -XX:InitantingHeapOccupancyPercent 设置,默认45%)之后,会触发并行标记,然后就会进行Mixed GC。Mixed GC 对一个叫做CSet的Region集合进行垃圾回收,其中包含了所有的年轻代Region和选取的一部分回收效益最好的Old Region。

并发标记的过程类似于CMS中的标记过程。

G1 可选优化参数
  1. 年轻代优化

    -XX:G1NewSizePercent   Java 堆初始化大小 ,默认是整个Java堆大小的5%,

    -XX:G1MaxNewPercent  最大占用对内存的百分比,默认是60%

    -XX:MaxGCPauseMills 每次目标停顿时间, 默认200ms

可以根据上述三个参数的调整来优化年轻代的垃圾回收

  1. 并行标记阶段优化

    并行标记阶段, -XX:InitantingHeapOccupancyPercent 决定了什么时候初始化并行标记循环 默认值45%

    -XX:ConcGCThreads 并发GC数量, 是-XX:ParallelGCThreads 的1/4 ,可以通过修改两个值来改变并线程的数量。

  2. 混合回收阶段优化

-XX:+PrintAdaptiveSizePoliy 开启后会输出完成的GC生态日志,

-XX:G1HeapWastePercent 表示最大可忍受的垃圾总量,默认是堆空间的5%,如果Mixed GC占用的时间过多,可以将此值调整大一点。

-XX:G1MixedGCCountTarget 默认为8,表示Mixed GC过程中入选的Old Region的最小阈值,用于控制入选的Old Region的数量

-XX:G1OldCSetRegionThresholdPercent 默认值100% ,表示加入到CSet中的Old Region的最大数量。

-XX:G1MixedGCLiveThresholdPercent 默认值 85% ,表示设置的每CSet中每个区间最多存活对象的百分比。

2 JVM的一些常用参数
  1. -XX:+PrintGCDetails 用于记录GC运行时的详细信息并输出。

  2. -verbose:gc -Xloggc:gc.log  结合前一个选项可以在项目根目录下生成gc.log文件记录gc详细信息

  3. -XX:+UseSerialGC 使用串行gc收集器,使用与小于100MB的内存空间场景

  4. -XX:+UserParNewGC 独占式GC , 多线程GC  (未来不可用)

  5. -XX:+UseParallelGC

  6. -XX:+UseParallelOldGC

  7. -XX:+UseConcMarkSweepGC

  8. -XX:+UseG1GC

  9. -XX:+PrintGCApplicationStoppedTime 输出GC造成应用程序暂停的时间

  10. -XX:+PrintGCApplicationConcurrentTime 与上面参数结合使用

  11. -XX:+ConcGCThreads=4 设置Java应用程序线程并行执行的GC线程数量 若设置的值超过JVM允许GC并行线程的数量则报错,   默认的并行标记线程数量计算如下   ConGCThreads = Max((ParallelGCThreads#+2)/4,1)

  12. -XX:G1HeapRegionSize G1 GC 独有,Region大小默认为堆的1/2000 也可以设置   1MB 2MB 4MB 8MB 16MB 32MB 等6个档次

  13. -XX:G1HeapWastePercent=5 控制G1GC 不会回收的空闲内存比例,默认是堆内存的5% G1 GC在回收过程中会回收所有Region的内存,并持续地进行回收工作,直到内存空闲比例达到次值

  14. -XX:G1MixedGCCountTarget=8 老年代Region 的回收时间通常来说比年轻带Region回收时间长,此选项设置并行循环之后启动多少个混合GC 默认值是 8个 设置一个比较大的值可以让G1 GC在老年代Region回收时多花一些时间,如果一个混合GC停顿的时间很长,说明它要做的使很多,所以可以增大这个值的设置,但这个值过大的话,会造成并行循环等待混合GC完成的时间也相应的增加。

  15. -XX:G1PrintRegionLivenessInfo 开启这个选项会在标记循环之后输出详细信息(诊断选项) 在使用之前需要开启-XX:UnlockDiagnosticVMOptions 选项, 此选项会打印内存内部每个Region里面存活的对象信息, 包括使用率 RSET大小、回收一个Region的价值(性价比) 15. -XX:G1ReservePercent=10 此选项默认保留对内存的10%,用于某个对象进入下一个阶段,预留内存空间不可用于年轻带

  16. -XX:+G1SummarizeRSetStats  打印每个Region的详细信息。  此选项和-XX:G1PrintRegionLivenessInfo选项一样,是一个诊断选项也需要开启 -XX:UnlockDiagnosticVMOptions 选项 。

  17. -XX:+G1TraceConcRefinement 诊断选项,启动这个选项,并行Refinement线程相关的信息会被打印,线程启动和结束时,信息都会被打印。

  18. -XX:G1UseAdaptiveConcRefinement 默认开启的选项, 它会动态地对每一次GC中-XX:G1ConcRefinementGreenZone、-XX:G1ConcRfinementYellowZone、-XX:-XX:G1ConcRfinementRedZone,的值进行重新计算 并行Refinement线程是持续运行的,并且会随着update log buffer 积累的数量而动态调节, -XX:G1ConcRefinementGreenZone、-XX:G1ConcRfinementYellowZone、-XX:-XX:G1ConcRfinementRedZone,三个选项是用来根据不同的buffer使用不同的Refinement线程,其作用就是保证Refinement线程尽可能更上update log buffer生产的的步伐

  19. -XX:GCTimeRatio=9 这个选项代表Java应用程序话费时间与GC线程花费时间的比率, 1/(1+GCTimeRatio) 默认值是9 表示花费在GC工作量上的时间占总时间的10%

  20. -XX:+HeapDumpBeforeFullGC/-XX:+HeapDumpAfterFullGC 启用此选项 , 在Full GC开始之前有一个hprof文件会被创建,   两个选项同时使用,可以对比Full GC前后的java堆内存,找出内存泄漏以及其他问题,

  21. -XX:InitiatingHeapOccypancyPercent=45 该选项默认值是45 表示G1 GC并行循环初始设置的堆大小值, 这个值决定了一个并行循环是不是要开始执行, 它的逻辑是在一次GC完成后,标胶老年代占用的空间和整个Java堆之间的比例,如果大于这个值,则预约下一次GC开始一个并行循环回收垃圾,从初始标记阶段开始。  这个值越小,GC 越频繁,反之 值越大,

  22. -XX:UseStringDeduplication 该选项启动String对象的去重工作,默认不启用。 如果启用该选项 String1.equals(String2) 如果两个对象包含相同的内容则返回true

  23. -XX:StringDeduplicationAgeThreshold=3  针对-XX:UseStringDeduplication选项,默认值为3   字符串对象的年龄超过设定的阈值,或者提升到G1 GC老年代Region之后,就会成为字符串去重的候选对象,去重操作只会有一次。

  24. -XX:PrintStringDeduplicationStatistics 可以通过读取输出的统计资料来了解是否字符串去重后节约了大量的堆内存空间,默认关闭

  25. -XX:+G1UseAdaptiveHOP JDK9的新选项 默认启用,通过动态调节标记阶段开始的时间,以达到提升应用程序吞吐量的目标, 主要通过尽可能迟地触发标记循环方式来避免消耗老年代空间,

  26. -XX:MaxGCPauseMills=200 【重要选项】设置G1的目标停顿时间 ,单位为ms 默认值为200ms

  27. -XX:MinHeapFreeRatio=40 设置对内可以空闲的最小的内存空间大小,默认为堆内存的40%   当空闲堆内存大小小于此值的时候,需要判断-Xms 和 -Xmx 两个初始化设置值,如果-Xms 和 -Xmx 不一样,那么就有机会扩展堆内存,否则就无法扩展。

  28. -X:MaxHeapFreeRatio =70 这只最大空闲空间大小,默认为堆内存的70%,当大于这个空闲比率的时候 G1 GC 会自动减少对内存的大小, 需要判断-Xms 和 -Xmx的大小 如果两者一样则有机会减小堆内存,否则无法减小堆内存

  29. -XX:+PrintAdaptiveSizePolicy 这个选项决定是否开启堆内存大小变化的相应记录信息打印, 是否打印这些星系到GC日志里面

  30. -XX:+ResizePLAB GC使用的本地线程分配缓存块采用动态值还是静态值 默认开启 31. -XX:+ResizeTLAB Java线程使用的本地线程分配缓存块采用 动态值还是静态值。默认开启

  31. -XX:+ClassUnloadingWithCncurrent 开启G1 GC在并行循环卸载类,尤其是在老年代的并行回收阶段,默认是开启的。  这个选项开启后会在并行循环的重标记阶段卸载JVM没有用到的类, 这些工作也可以放到Full GC 里面去做。是否开启此选项要看性价比。如果GC停顿时间比我们设置的最大GC停顿目标时间还长,并且需要卸载的类也不多,建议关闭此选项

  32. -XX:+ClassUnloading 默认是是True 决定JVM是否会卸载无用的类,如果关闭此选项,无论是并行回收循环还是Full GC 都不会再卸载这些类,所以需要谨慎关闭

  33. -XX:+UnloadingDiagnosticVMOptions 是否开启诊断选项,默认值是 False

  34. -XX:+UnlockExperimentalVMOptions 默认关闭

  35. -XX:+UnlockCommercialFeatures  是都使用Oracle特有特性, 默认关闭

3 JVM常用调优分析工具

JVM内存分析调优,如果能多多利用调优的一些工具,那将会事半功倍。那么指北君问大家介绍比较好用的一些调优工具,包括Java自带的和第三方的一些好用工具。

jps

JVM Process Status Tool,查询当前运行状态的Java 进程

语法格式

jps [<options>]

具体 [options]选项:-q:仅输出VM标识列表;-m:输出main方法的参数,输出可能为null;-l:输出完整的包名,应用main calss,jar的完全路径名;-v:输出JVM参数 ;-V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 ;

jinfo

JVM Configuration info ,查询Java进程运行时的详细信息以及JVM的参数详细信息

命令格式

jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP 

具体 [options]选项:

-flag name  :prints the name and value of the given command line flag.

-flag [+|-]name :enables or disables the given boolean command line flag.

-flag name=value  :sets the given command line flag to the specified value.

-flags prints :command line flags passed to the JVM. pairs.

-sysprops :prints Java System properties as name, value pairs.

示例:

bin>jinfo -flags 17876
VM Flags:
-XX:CICompilerCount=2 -XX:ConcGCThreads=1 -XX:ErrorFile=C:\Users\Michael\java_error_in_idea64_%p.log -XX:G1ConcRefinementThreads=4...

bin>jinfo -flag InitialHeapSize 17876
-XX:InitialHeapSize=134217728


##### jstat

JVM Statistics Monitoring Tool  可查看JVM的性能统计信息,能显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。可参考官网详情:https://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html

命令格式

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]


generalOption 通用命令行参数,

outputOptions 一个过多个输出选项,

vmid 虚拟机定位标识,确定虚拟机运行的机器端口等

interval 查询并显示信息的时间间隔

count 需要查询信息的数量

关于jstat的参数选项有如:

| Option | Displays... |
| --- | --- |
| class | Statistics on the behavior of the class loader. |
| compiler | Statistics of the behavior of the HotSpot Just-in-Time compiler. |
| gc | Statistics of the behavior of the garbage collected heap. |
| gccapacity | Statistics of the capacities of the generations and their corresponding spaces. |
| gccause | Summary of garbage collection statistics (same as **\-gcutil**), with the cause of the last and current (if applicable) garbage collection events. |
| gcnew | Statistics of the behavior of the new generation. |
| gcnewcapacity | Statistics of the sizes of the new generations and its corresponding spaces. |
| gcold | Statistics of the behavior of the old and permanent generations. |
| gcoldcapacity | Statistics of the sizes of the old generation. |
| gcpermcapacity | Statistics of the sizes of the permanent generation. |
| gcutil | Summary of garbage collection statistics. |
| printcompilation | HotSpot compilation method statistics. |

示例:

bin>jstat -gcoldcapacity -t 17876 250 3
Timestamp          OGCMN        OGCMX         OGC           OC       YGC    FGC    FGCT     CGC    CGCT       GCT
         6378.7          0.0    1042432.0     505856.0     505856.0    310     0     0.000   134     3.033     7.305
         6379.0          0.0    1042432.0     505856.0     505856.0    310     0     0.000   134     3.033     7.305
         6379.3          0.0    1042432.0     505856.0     505856.0    310     0     0.000   134     3.033     7.305


##### jmap

JVM Memory Map 输出对象内存信息,Java堆信息等

命令格式

jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP


options选项

**\-dump:\[live,\]format=b,file=**  将Java堆生成dump文件,

**\-finalizerinfo** 输出等待执行finalizer方法的对象

**\-heap** 输出堆的详细信息,GC算法,堆参数等等

**\-histo\[:live\]** 输出堆的统计信息,包括Java类,对象数量,内存size等

**\-permstat** Prints class loader wise statistics of permanent generation of Java heap

**\-F** 强制生成dump,与jmap -dump / jmap -histo 等一起使用,如果进程id没有响应则强制生成dump文件

示例:

bin>jmap -finalizerinfo 17876
No instances waiting for finalization found


生成Java 堆dump文件

bin>jmap -dump:format=b,file=E:/Java/heap/17876.hprof 17876
Heap dump file created


##### jstack

主要输出 Java线程的堆栈信息

jstack [options] pid


示例:

bin>jstack -l 17876


##### JConsole

JConsole 是Java自带的可视化程序,可以监控一些内存线程等信息,使用也比较方便。

![图片](https://img-blog.csdnimg.cn/img_convert/ada9032b0609c5c58424e69ef504daaf.png)

  

  

##### VisualVM

VisualVM在在Java8之后就被从JDK中拿走,如果想使用可以去VisualVM官网(文末贴出下载地址)下载,它有标准版和基于GraalVM的版本,同时还有IDEA的插件用起来也比较方便。我们下载标准版VisualVM2.07先看一下。还是熟悉的味道。

![图片](https://img-blog.csdnimg.cn/img_convert/600846564c1a142dcc4947c1a0a155e9.png)

  

  

##### Memory Analyzer (MAT)

Eclipse 出品的一款Java堆内存分析程序,可以帮助我们找到内存泄漏和减少内存消耗。可在其官网下载,文末贴出下载地址

![图片](https://img-blog.csdnimg.cn/img_convert/f3d1f91f8b291ca4468db94bd5342191.png)

  

### 总结

本篇总结了一些常用GC的垃圾回收流程,GC调优可以参考的一些参数。另外还介绍了一些分析Java性能的一下Java命令及可视化分析工具,在实际生产环境使用的话肯定会比所介绍的还要复杂,所以看官们还不快快动起手来操练一下。让你的JVM不再寂寞。由于每一个工具的详细使用都需要大篇幅,那么指北君后面将会为大家一一带来这些工具如何进行JVM性能调优。敬请期待!

### 后记

VisualVM 官网 :https://visualvm.github.io/

GraalVM 官网 :https://www.graalvm.org/

Memory Analyzer (MAT) 下载 官网:https://www.eclipse.org/mat/downloads.php (选择国内中科大的镜像,下载会快许多)

**面试大全包括:**包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!

**领取方式:扫描下方公众号【Java技术指北】回复【面试题】即可获取**

![图片](https://img-blog.csdnimg.cn/img_convert/9e404a6d6f245a52e78a140d9691bf95.png)

![Java技术指北](https://img-blog.csdnimg.cn/img_convert/258e4bd7c4b53e4bc0c748783acddc06.png)

**Java技术指北**

回复:java,获取精华资料。专注分享Java技术干货、Java 技术、Spring 全家桶、JavaWeb、多线程、JVM、Spring Boot、Spring Cloud、Dubbo、架构设计、微服务、面试题、Java最新动态等。

43篇原创内容

公众号
【Docker】如何让docker容器正常使用nvidia显卡 描述了如何在docker容器中使用英伟达显卡的过程和问题解决方法。 阅读详情

相关推荐

UE4/5项目GPU崩溃?可能是Windows的TDR机制在搞鬼!深入浅出聊聊TdrDelay与显卡超时

本文深入探讨了UE4/5项目中GPU崩溃的常见原因,揭示了Windows TDR机制的工作原理及其对渲染进程的影响。通过调整TdrDelay参数和优化GPU负载,提供了解决显卡超时问题的实用方案,帮助开发者提升项目稳定性。

weixin_30691649的博客 410

【JVM】JVM内存结构之——G1收集器

目录1. 什么是G12. G1收集器发展历程3. G1收集器分区划分3.1 为什么G1收集器需要设计巨型对象3.2 G1收集器参数设置3.3 G1收集器回收的细节3.4 G1收集器Rset问题(记忆集)3.5 G1两种回收策略4. G1收集器优缺点5. G1收集器核心配置参数 1. 什么是G1 G1收集器(Garbage-First Garbage Collector) 整堆收集。 G1收集器是一款在server端运行的垃圾收集器,专门针对于拥有多核处理器和大内存的机器,在JDK 7u4版本发行时被正式

记录各种Bug解决案例及日常学习内容 6570

深入解析ACS SPiiPlus运动控制器的托管API架构与实战应用

本文深入解析了ACS SPiiPlus运动控制器的托管API架构,详细介绍了其核心模块、设计哲学与实战应用。通过C#/.NET封装的托管接口,开发者能够高效实现多轴协同运动控制、EtherCAT总线集成以及事件驱动的异步编程,显著提升高精度工业自动化设备的开发效率与系统稳定性。

jwt8token的博客 861

G1 GC详解及设置

G1 GC详解及Full GC的触发情况

深圳市多克创新科技有限公司 7085

IMA知识库:从0到1的架构设计与实践

本文探讨了AI时代知识库系统的架构设计与演进路径。通过分析知识入库、知识管理和知识应用三大核心业务流程,提出了应对数据多样性、处理标准化、流量洪峰等挑战的解决方案。重点介绍了基于统一数据格式的解耦设计、异步处理架构、服务拆分策略以及权限安全体系,构建了一个稳定、高效且可扩展的知识库系统。文章强调优秀架构需要持续演进,通过识别薄弱点不断优化,最终实现技术方案与业务需求的平衡。

lovehu6686的博客 1737

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2681

性能调优 13. 垃圾收集器G1&ZGC详解

是JDK 11中推出的一款追求极致低延迟的垃圾收集器,它曾经设计目标包括:‌‌‌  1. 停顿时间不超过10ms(JDK16已经达到不超过1ms‌‌‌  2.停顿时间不会随着堆的大小,或者活跃对象的大小而增加。‌‌‌  3. 支持8MB~4TB级别的堆,JDK15后已经可以支持16TB。‌‌‌  如果使用ZGC来做Java项目,像对STW敏感的证券系统,游戏的系统都可以去用Java来做(以前都是C或者C++的市场),所以ZGC的出现就是为了抢占其他语言的市场。

xingwanganfang的博客 3716

循环神经网络(RNN)原理及BPTT算法

因循环神经网络基于ANN之上,理解ANN有助于理解RNN,所以阅读此文,建议先阅读。

L 1768

(JVM学习05)垃圾收集器G1&ZGC详解

垃圾收集器G1&ZGC详解

a250029634的博客 3506

OMAPL138使用UPP读写测试

UPP测试代码 #include "hw_types.h" // 宏命令 #include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器 #include "soc_OMAPL138.h" // DSP C6748 外设寄存器 #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 #include "interrupt.h" // DSP C6748 中断相关应用程序接...

wangjie36的博客 1193

杰理AC695N系列芯片 LED7数码管使用教程

杰理AC695N数码管使用摘要 本教程介绍了杰理AC695N芯片驱动LED7数码管的实现方法: 硬件配置:支持7/12/13脚三种数码管类型,详细说明了7脚数码管的标准段码定义和GPIO接线方式。 软件设置: 通过修改配置文件启用LED7功能 配置GPIO引脚映射(PORTC/PORTA组) 选择与硬件匹配的真值表 层次架构:包含硬件层、驱动层、UI层和应用层的完整设计,支持数字、字符和图标显示功能。 实现要点包括正确配置引脚类型、选择真值表,并通过UI风格设置为LED7模式。

qq_42014563的博客 1347

G1调优常用参数及其作用

G1调优参数及其作用机制

点滴之积 1万+

YOLO系列专栏(五):YOLO26 模型部署实战 | 从训练完成到落地应用(CPU/GPU/移动端)

训练好的YOLO26模型,本质上是一个权重文件(.pt格式),无法直接在实际场景中使用——不同应用场景需要不同格式的模型(如ONNX、TensorRT、TFLite),不同设备(CPU/GPU/移动端)的部署方式也截然不同。在保证模型精度基本不变的前提下,最大化提升推理速度,适配不同硬件设备。如果部署不当,会出现以下问题:❌ 推理速度慢:CPU部署单帧推理耗时超过100ms,无法满足实时检测需求(如监控、自动驾驶);❌ 模型格式不兼容:直接使用.pt权重文件,无法在移动端、嵌入式设备上运行;

qq_36130719的博客 632

JVM参数&JVM调优笔记

目录 前言篇 内存参数篇 jstack-栈信息 jmat-堆信息 jstat-GC信息 前言篇 实测:分别调整JVM堆大小,启动idea,jstat -GC 查看堆信息如下: 64bit-16G 电脑 S0C(kb) S1C(kb) EC(kb) OC(kb) MC(kb) 年轻代 老年代 堆大小 年轻代占比 老年代占比 年轻代Eden占比 年轻代S0占比 年轻代S1占比 设置堆大小M 3584 4096 13312 44032 33792 20.5 43 63.5

张小凡 1390

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【JVM详解&JVM优化】聊聊JVM优化

我们将探讨多种JVM优化技术,包括堆内存的合理配置、垃圾收集器的选择与调优,以及如何通过JVM参数调整来提高性能,文章最后分享一些实际调优经验。

longshehui的博客 962

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【JVM详解&JVM优化】JVM垃圾回收机制

整篇文章介绍了垃圾标识算法以及他们各自适用的场景;对象在内存中是如何分配以及流转的以及传统垃圾回收器介绍。

longshehui的博客 1605

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java语言&JVM

经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1.对象在 Survivor 中每熬过一次 MinorGC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象总是在新生代的Eden区进行分配,Java GC是可以手动触发的,比如通过System.gc()方法,尽管这只是建议JVM进行垃圾回收,但并不保证一定会执行。将内存分为大小相同的两块,每次使用其中的一块。

BlinderFucker的博客 214

Java内存模型&JVM参数

1.工作内存和主内存          Java内存模型对顶所有的变量都存储在主内存中(JVM内存的一部分),每个线程有自己独立的工作内存,工作内存保存了当前线程使用的对主内存变量的赋值。线程对这些变量的操作都在自己的工作内存中进行,而不能直接操作主内存和其他线程对应的工作内存中存储的变量或者变量副本。线程间的变量访问需要主内存来完成。

zzjstudent的专栏 487

JVM 内存模型、垃圾收集篇-01-Jvm参数配置&JVM内存模型图

***

weixin_44888252的博客 300

java-JVM内存区域&JVM运行时内存

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和To Survivor 区)和老年代。

wchg21131的博客 662

资料搜集-JAVA系统的梳理知识5-JAVA基础篇&JVM

<!-- TOC --> - [Collections 工具类和 Arrays 工具类常见方法](#collections-工具类和-arrays-工具类常见方法) - [Collections](#collections) - [排序操作](#排序操作) - [查找,替换操作](#查找替换操作) - [同步控制](#同...

java技术专家全栈成长之路 1026

Tomcat 性能优化策略

系统性能的衡量指标,主要是响应时间和吞吐量。 1)响应时间:执⾏某个操作的耗时; 2) 吞吐量:系统在给定时间内能够⽀持的事务数量,单位为TPS(Transactions PerSecond的缩写,也 就是事务数/秒,⼀个事务是指⼀个客户机向服务器发送请求然后服务器做出反应的过程。 Tomcat优化从两个⽅⾯进⾏ 1) JVM虚拟机优化(优化内存模型) 2) Tomcat⾃身配置的优化(⽐如是否使⽤了共享线程池? IO模型?) JVM虚拟机优化 Java 虚拟机的运⾏优化主要是内存分配和垃圾回收策略的优化:

小城我家 358

十二、G1垃圾收集器

并行与并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。空间整合:与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器,从局部上来看是基于“复制算法”实现的。可预测的停顿。

weixin_40181736的博客 3040

JVM GC G1垃圾回收器配置

JVM GC G1垃圾回收器配置

年少青山的博客 4474

g1gc调优的一次实战记录

Java内存区域 或 Jvm 内存结构 线程共享的 堆 方法区 直接内存 (非运行时数据区的一部分) 线程私有的 程序计数器 虚拟机栈 本地方法栈 GC算法 1,标记 -清除算法 2,复制算法 3,标记-压缩算法 4,分代收集算法 一般将堆分为新生代和老年代。 新生代使用: 复制算法 老年代使用: 标记 - 清除 或者 标记 - 整理 算法 JDK 8 版本之后方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间 G1 GC G1 GC是Java H

请叫我大师兄 7294

JVM性能调优-垃圾收集器G1详解

XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。ZGC的停顿时间是在10ms以下,但是ZGC的执行时间还是远远大于这个时间的。

EverythingAtOnce的博客 2807
上一篇: JVM调优及调优工具汇总,GC垃圾收集器总结
下一篇: 我说Java完全面向对象,老大过来就是一jio
JavaTechNorth
博客等级 码龄5年 36粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值