- 浏览: 114781 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (98)
- java (27)
- jms (2)
- jta (0)
- 性能调优及内存分析 (4)
- 设计模式 (14)
- 框架 (6)
- 其它 (9)
- job (1)
- maven (1)
- 服务器 (2)
- 分布式 (3)
- ibatis (1)
- linux (0)
- mysql (0)
- 并发编程 (0)
- java多线程 (2)
- 前端跨域 (1)
- 线程dump分析 (0)
- velocity (0)
- 数据库 (2)
- 协议 (0)
- 监控 (0)
- 开源软件 (2)
- 算法 (0)
- 网络 (1)
- spring (1)
- 编码 (0)
- 数据结构 (0)
- HTable和HTablePool使用注意事项 (0)
- opencms (0)
- android (16)
- 操作系统 (2)
- top (0)
最新评论
-
hold_on:
@Override public boolea ...
android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片) -
achersnake:
123
Servlet中listener(监听器)和filter的总结 -
angel243fly:
我用了这个方法,还是报同样的错误,还有什么建议吗?
eclipse提示CreateProcess error=87错误的解决方法
转:http://www.iteye.com/topic/976522
目录
内存管理简介
GC简介
好的Collector的特性
设计或选择Collector
GC性能指标
分代GC
Java Collector
快速内存分配
GC根集合
Serial Collector
Parallel Collector/Throughput Collector
Parallel Compacting Collector
Concurrent Mark Sweep Collector (CMS)
4种Collector的对比和适用场景。
Ergonomics
GC调优
OutOfMemoryError
freeMemory(),totalMemory(),maxMemory()
jmap工具的使用
内存管理简介
内存管理的职责为分配内存,回收内存。
没有自动内存管理的语言/平台容易发生错误。
典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。
另一个典型问题为内存泄露,内存已经分配,但是已经没有了指向该内存的指针,导致内存泄露。
程序员要花费大量时间在调试该类问题上。
GC简介
因此引入了Garbage Collector机制,由运行时环境来自动管理内存。
Garbage Collector解决了悬挂指针和内存泄露大部分的问题(不是全部)。
注意Garbage Collector(简称Collector)和Garbage Collection(简称GC)的区别。
Collector的职责:
分配内存。
保证有引用的内存不被释放。
回收没有指针引用的内存。
对象被引用称为活对象,对象没有被引用称为垃圾对象/垃圾/垃圾内存,找到垃圾对象并回收是Collector的一个主要工作,该过程称为GC。
Collector一般使用一个称为堆的内存池来进行内存的分配和回收。
一般的,当堆内存满或者达到一个阀值时,堆内存或者部分堆内存被GC。
好的Collector的特性
保证有引用的对象不被GC。
快速的回收内存垃圾。
在程序运行期间GC要高效,尽量少的影响程序运行。和大部分的计算机问题一样,这是一个关于空间,时间,效率平衡的问题。
避免内存碎片,内存碎片导致占用大量内存的大对象内存申请难以满足。可以采用Compaction技术避免内存碎片。Compaction技术:把活对象移向连续内存区的一端,回收其余的内存以便以后的分配。
良好的扩展性,内存分配和GC在多核机器上不应该成为性能瓶颈。
设计或选择Collector
串行或并行。
串行Collector在多核上也只有一个线程在运行,并行Collector可以同时有多个线程执行GC,但是其算法更复杂。
并发或Stop the World。
Stop the World Collection执行GC时,需要冻住所有内存,因此更简单一些,但是,在GC时,程序是被挂起的。并发GC时,程序和GC同时执行,当然,一般的并发GC算法还是需要一些Stop the World时间。
Compacting or Non-compacting or Copying
Compacting: 去除内存碎片,回收内存慢,分配内存快。
Non-compacting: 容易产生内存碎片,回收内存快,分配内存慢,对大对象内存分配支持不好。
Copying: 复制活对象到新的内存区域,原有内存直接回收,需要额外的时间来做复制,额外的空间来做存储。
GC性能指标
Throughput: 程序时间(不包含GC时间)/总时间。
GC overhead: GC时间/总时间。
Pause time: GC运行时程序挂起时间。
Frequency of GC: GC频率。
Footprint: a measure of size, such as heap size。
Promptness:对象变为垃圾到该垃圾被回收后内存可用的时间。
依赖于不同的场景,对于GC的性能指标的关注点也不一样。
分代GC
分代GC把内存划分为多个代(内存区域),每个代存储不同年龄的对象。 常见的分为2代,young和old。
分配内存时,先从young代分配,如果young代已满,可以执行GC(可能导致对象提升),如果有空间,则分配,如果young代还是没有空间,可以对整个内存堆GC。
young代GC后还存活的对象可以提升到old代。
该机制基于以下观察事实:
1 大部分新分配的对象很快就没有引用了,变成垃圾。
2 很少有old代对象引用young代对象。
基于代内存存储对象的特性,对不同代的内存可以使用不同的GC算法。
Young代GC需要高效,快速,频繁的执行,关注点主要在速度上。
Old代由于增长缓慢,因此GC不频繁,但是其内存空间比较大,因此,需要更长时间才能执行完GC。关注点在内存空间利用率上。
Java Collector
Jvm的内存分为3代。Young, Old, Permanent。
大部分对象存储在Young代。
在Young代中经历数次GC存活的对象可以提升到Old代,大对象也可以直接分配到Old代。
Permanent代保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。
Young代由一个Eden和2个survivor组成。大部分的对象的内存分配和回收在这里完成。
Survivor存储至少经过一次GC存活下来的对象,以增大该对象在提升至old代前被回收的机会。2个survivor中有一个为空。分别为From和to survivor。
当young代内存满,执行young代GC(minor GC)。
当old或permanent代内存满,执行full GC(major GC),所有代都被GC。一般先执行young GC,再执行old, permanent GC。
有时old代太满,以至于如果young GC先运行,则无法存储提升的对象。这时,Young GC不运行,old GC算法在整个堆上运行(CMS collector是个例外,该collector不能运行在young 代上)。
快速内存分配
大部分的内存分配请求发生时,Collector都有一块大的连续内存块,简单的内存大小计算和指针移动就可以分配内存了。因此非常快速。该技术称为bump –the-pointer技术。
对于多线程的内存分配,每个线程使用Thread Local Allocation Buffer(TLAB)进行分配,因此还是很高效。TLAB可以看作一个线程的特殊代。只有TLAB满的时候才需要进行同步操作。
GC根集合
GC运行时当前程序可以直接访问的对象。如线程中当前调用栈的方法参数,局部变量,静态变量,当前线程对象等等。
Collector根据GC根集合来寻找所有活对象。GC根集合不可达对象自然就是垃圾了。
Serial Collector
单线程,Young and old GC是串行,stop the world GC的。
Young GC。
Eden中活对象copy到to survivor中,大对象直接进old代。
From survivor中相对老的活对象进入old代,相对年轻的对象进入to survivor中。
如果to survivor放不下活对象,则这些活对象直接进入old。
经历过young GC,Eden和from survivor都变成空的内存区域,to survivor存储有活的对象。To survivor和from survivor角色互换。
Old permanent GC。
Mark-sweep-compact算法。
S1 标识哪些对象是活的对象。
S2 标识哪些对象是垃圾。
S3 把活的对象压缩到内存的一端,以便可以使用bump –the-pointer处理以后的内存分配请求。
非server-class machine 的默认GC。
也可以使用命令行参数来设定。
-XX:+UseSerialGC
Parallel Collector/Throughput Collector
利用了现代计算机大部分都是多核的事实。
Young GC。
和Serial Collector一样,是一个stop the world和copying Collector。只不过是多线程并行扫描和做copy,提高速度,减少了stop the world的时间,增大了throughput。
Old permanent GC。
和serial collector一样。Mark-sweep-compact算法。单线程。
Server-class machine的默认GC。
也可以使用命令行参数来设定。
-XX:+UseParallelGC
Parallel Compacting Collector
Young GC。
和Parallel Collector一样。
Old Permanent GC。
Stop the world,并且多线程并发GC。
每一代被划分为一些长度固定的区域。
第1步(mark phase),GC根集合划分后分发给多个GC线程,每个GC线程更新可达活对象所在区域的信息(活对象的内存位置,大小)。
第2步(summary phase),操作在区域上,而不是对象上。由于以前GC的影响,内存的一端活对象的密度比较高,在该阶段找到一个临界点,该临界点以前的区域由于活对象内存密度高,不参与GC,不做compact。该临界点之后的区域参与GC,做compact。该阶段为单线程执行。
第3步(compact phase)。GC多线程使用summary info做回收和compact工作。
可以设置GC线程数,防止GC线程长时间占有整台机器的资源。
-XX:ParallelGCThreads=n
使用命令行参数来设定。
-XX:+UseParallelOldGC
Concurrent Mark Sweep Collector (CMS)
Young GC。
和Parallel Collector一样。
Old permanent GC。
GC和程序并发执行。
Initial Phase:短暂停,标记GC根集合。单线程执行。
Concurrent marking phase: GC多线程标记从根集合可达的所有活对象。程序和GC并发运行。由于是并发运行,有可能有活对象没有被标记上。
concurrent pre-clean:单线程,并发执行。
Remark phase: 短暂停,多线程标记在Concurrent marking phase中有变化的相关对象。
Concurrent sweep phase:和程序并发执行。单线程执行。不做compacting。
concurrent reset:单线程,并发执行。
CMS不做compacting,不能使用bump-the-pointer技术,只能使用传统的内存空闲链表技术。
导致内存分配变慢,影响了Young代的GC速度,因为Young的GC如果有对象提升的话依赖于Old的内存分配。
CMS需要更多的内存空间,因为mark phase时程序还是在运行,程序可以申请更多的old空间。在mark phase中,CMS保证标识活对象,但是该过程中,活对象可能转变为垃圾,只能等待下一次GC才能回收。
和其他Collector不同,CMS不是等到old满时才GC,基于以前的统计数据(GC时间,Old空间消耗速度)来决定何时GC。CMS GC也可以基于old空间的占用率。
命令行参数:
-XX:CMSInitiatingOccupancyFraction=n,n为百分比,默认68。
可以设置
-XX:+UseCMSInitiatingOccupancyOnly 来使vm只使用old内存占用比来触发CMS GC。
Incremental Mode。
CMS的concurrent phase可以是渐进式执行。以减少程序的一次暂停时间。
命令行参数:
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
4种Collector的对比和适用场景。
直到jdk1.3.1,java只提供Serial Collector,Serial Collector在多核的机器上表现比较差。主要是throughput比较差。
大型应用(大内存,多核)应该选用并行Collector。
Serial Collector:大多数client-style机器。对于低程序暂停时间没有需求的程序。
Parallel Collector:多核机器,对于低程序暂停时间没有需求的程序。
Parallel Compacting Collector:多核机器,对于低程序暂停时间有需求的程序。
CMS Collector:和Parallel Compacting Collector相比,降低了程序暂停时间,但是young GC程序暂停时间变长,需要更大的堆空间,降低了程序的throughput。
Ergonomics
J2SE 5.0后,Collector的选择,堆大小的选择,VM(client还是server)的选择,都可以依赖平台和OS来做自动选择。
JVM会自动选择使用server mode还是client mode。但是我们一样可以手工设置。
java -server -client
Server-class machine的选择:
2个或更多的处理器
And
2G或更多的物理内存
And
不是32bits,windows OS。
Client-class
The client JVM
The serial collector
Initial heap size = 4M
Max heap size=64M
Server-class
The server JVM
The parallel collector
Initial heap size= 1/64物理内存(>=32M),最大1G。
Max heap size=1/4物理内存,最大1G。
基于行为的调优。
可以基于最大暂停时间或throughput。
-XX:MaxGCPauseMillis=n
指示vm调整堆大小和其他参数来满足这个时间需求。如果vm不满足该目标,则减小堆大小来满足该目标。该目标没有默认值。
-XX:GCTimeRatio=n
GC time/APP time=1/(1+n)
如n=99表示GC时间占整个运行时间的1%。
如果该目标不能满足,则增大堆大小来满足该目标。默认值n=99。
Footprint Goal
如果最大暂停时间和Throughput目标都满足了,则减少堆大小直到有一个目标不满足,然后又回调。
目标优先级:
最大暂停时间>Throughput>footprint。
GC调优
由于有了Ergonomics,第一个建议就是不要手工去配置各种参数。让系统自己去根据平台和OS来选择。然后观测性能,如果OK的话,呵呵,不用搞了。
但是Ergonomics也不是万能的。因此还是需要程序员来手工搞。
注意性能问题一定要测量/调优/测量/调优不停的循环下去。
Vm mode 选择。
Java -server server mode.
Java -client client mode.
观测性能主要使用gc的统计信息。
-XX:+PrintGC 输出GC信息。
-XX:+PrintGCDetails输出GC详细信息。
-XX:+PrintGCTimeStamps 输出时间戳,和–XX:+PrintGC 或–XX:+PrintGCDetails一起使用。
-Xloggc: gc.log 输出到指定文件。
1 决定堆内存大小。
决定整个堆内存的大小。内存的大小对于Collector的性能影响是最大的。
使用以下参数来决定堆内存的大小。
可以决定堆空间的起始值和最大值,大型程序可以考虑把起始值调大,避免程序启动时频繁GC和内存扩展申请。
以及堆空间中可用内存的比例范围,vm会动态管理堆内存来满足该比例范围。
-XX:MinHeapFreeRatio=n
-XX:MaxHeapFreeRatio=n
-Xmsn Young和Old的起始内存
-Xmxn Young和Old的最大内存
2 决定代空间大小。
Young代空间越大,则minor GC的频率越小。但是,给定堆内存大小,Young代空间大,则major GC频率变大。
如果没有过多的Full GC或者过长的暂停时间问题,给young代尽量大的空间。
Young Generation Guarantee。
对于serial collector,当执行minor GC时,必须保证old代中有可用的空间来处理最坏情况(即eden和survivor空间中的对象都是活对象,需要提升至old空间),如果不满足,则该minor GC触发major GC。所以对于serial collector,设置eden+survivor的内存不要大过old代内存。
其他collector不做该保证,只有old代无法存储提升对象时才触发major GC。
对于其他collector,由于多线程做minor GC时,考虑到最坏情况,每个线程要在old代内存预留一定空间做对象提升,因此可能导致内存碎片。因此old代内存应该调整的更大一些。
-XX:NewSize=n young代空间下限。
-XX:MaxNewSize=n young代空间上限。
-XX:NewRatio=n young和old代的比例。
-XX:SurvivorRatio=n Eden和单个survivor的比例。
-XX:PermSize=n Permanent起始值。
-XX:MaxPermSize=n Permanent最大值。
3 决定使用Collector
可以考虑是否需要换一个Collector。
Collector选择
-XX:+UseSerialGC Serial
-XX:+UseParallelGC Parallel
-XX:+UseParallelOldGC Parallel compacting
-XX:+UseConcMarkSweepGC Concurrent mark–sweep (CMS)
Parallel和Parallel Compacting Collector.
-XX:ParallelGCThreads=n
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n
设定目标好于明确设定参数值。
为了增大Throughput,堆大小需要变大。可以把堆大小设为物理内存允许的最大值(同时程序不swapping)来检测该环境可以支持的最大throughput。
为了减小最大暂停时间和footprint,堆大小需要变小。
2个目标有一定的矛盾,因此要视具体应用场景,做平衡。
CMS Collector
-XX:+CMSIncrementalMode 和CMS同时使用。
-XX:+CMSIncrementalPacing 和CMS同时使用。
-XX:ParallelGCThreads=n
-XX:CMSInitiatingOccupancyFraction=n,n为百分比,默认68。
OutOfMemoryError
可以指定
-XX:+HeapDumpOnOutOfMemoryError
当发生OutOfMemoryError时dump出堆内存。
发生OutOfMemoryError时可以观测该Error的详细信息。
Java heap space:
调整堆大小。
程序中含有大量带有finalize方法的对象。执行finalize方法的线程顶不住了。
PermGen space:
Permanent代内存不够用了。
Requested array size exceeds VM limit。
堆内存不够用。
程序bug,一次分配太多内存。
freeMemory(),totalMemory(),maxMemory()
java.lang.Runtime类中的 freeMemory(), totalMemory(), maxMemory()这几个方法的反映的都是 java这个进程的内存情况,跟操作系统的内存根本没有关系。
maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是jvm默认的可以使用内存大小,client为64M,server为1G。如果添加了-Xmx参数,将以这个参数后面的值为准。
totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直 到挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖 -Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。
freeMemory()是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操 作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程 序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可能会有些大。
jmap工具的使用
jmap pid 查看共享对象。
jmap -heap pid 查看java进程堆的相关信息。
- $ jmap -heap 5695
- Attaching to process ID 5695, please wait...
- Debugger attached successfully.
- Server compiler detected.
- JVM version is 17.0-b16
- using parallel threads in the new generation.
- using thread-local object allocation.
- Concurrent Mark-Sweep GC
- Heap Configuration:
- MinHeapFreeRatio = 40
- MaxHeapFreeRatio = 70
- MaxHeapSize = 1342177280 (1280.0MB)
- NewSize = 134217728 (128.0MB)
- MaxNewSize = 134217728 (128.0MB)
- OldSize = 4194304 (4.0MB)
- NewRatio = 2
- SurvivorRatio = 20000
- PermSize = 100663296 (96.0MB)
- MaxPermSize = 134217728 (128.0MB)
- Heap Usage:
- New Generation (Eden + 1 Survivor Space):
- capacity = 134152192 (127.9375MB)
- used = 34518744 (32.919639587402344MB)
- free = 99633448 (95.01786041259766MB)
- 25.731032408326207% used
- Eden Space:
- capacity = 134086656 (127.875MB)
- used = 34518744 (32.919639587402344MB)
- free = 99567912 (94.95536041259766MB)
- 25.743608670500368% used
- From Space:
- capacity = 65536 (0.0625MB)
- used = 0 (0.0MB)
- free = 65536 (0.0625MB)
- 0.0% used
- To Space:
- capacity = 65536 (0.0625MB)
- used = 0 (0.0MB)
- free = 65536 (0.0625MB)
- 0.0% used
- concurrent mark-sweep generation:
- capacity = 671088640 (640.0MB)
- used = 287118912 (273.81793212890625MB)
- free = 383969728 (366.18206787109375MB)
- 42.7840518951416% used
- Perm Generation:
- capacity = 100663296 (96.0MB)
- used = 41864504 (39.92510223388672MB)
- free = 58798792 (56.07489776611328MB)
- 41.58864816029867% used
$ jmap -heap 5695 Attaching to process ID 5695, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0-b16 using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1342177280 (1280.0MB) NewSize = 134217728 (128.0MB) MaxNewSize = 134217728 (128.0MB) OldSize = 4194304 (4.0MB) NewRatio = 2 SurvivorRatio = 20000 PermSize = 100663296 (96.0MB) MaxPermSize = 134217728 (128.0MB) Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 134152192 (127.9375MB) used = 34518744 (32.919639587402344MB) free = 99633448 (95.01786041259766MB) 25.731032408326207% used Eden Space: capacity = 134086656 (127.875MB) used = 34518744 (32.919639587402344MB) free = 99567912 (94.95536041259766MB) 25.743608670500368% used From Space: capacity = 65536 (0.0625MB) used = 0 (0.0MB) free = 65536 (0.0625MB) 0.0% used To Space: capacity = 65536 (0.0625MB) used = 0 (0.0MB) free = 65536 (0.0625MB) 0.0% used concurrent mark-sweep generation: capacity = 671088640 (640.0MB) used = 287118912 (273.81793212890625MB) free = 383969728 (366.18206787109375MB) 42.7840518951416% used Perm Generation: capacity = 100663296 (96.0MB) used = 41864504 (39.92510223388672MB) free = 58798792 (56.07489776611328MB) 41.58864816029867% used
jmap –histo pid 查询各种对象占用的内存大小。
- $ jmap -histo 5695 | less
- num #instances #bytes class name
- ----------------------------------------------
- 1: 320290 63305456 [C
- 2: 1457010 46624320 java.util.concurrent.ConcurrentHashMap$Segment
- 3: 1502500 36060000 java.util.concurrent.locks.ReentrantLock$NonfairSync
- 4: 87785 29987632 [I
- 5: 1457010 23638928 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
- 6: 285668 15240784 [Ljava.lang.Object;
- 7: 87239 10680160 <constMethodKlass>
- 8: 399482 9587568 java.lang.String
- 9: 16533 7466624 [B
- 10: 91065 7285072 [Ljava.util.concurrent.ConcurrentHashMap$Segment;
- 11: 87239 6983288 <methodKlass>
- 12: 125750 5868720 <symbolKlass>
- 13: 45409 5449080 java.net.SocksSocketImpl
- 14: 63574 4936176 [S
- 15: 45294 4710576 sun.nio.ch.SocketChannelImpl
$ jmap -histo 5695 | less num #instances #bytes class name ---------------------------------------------- 1: 320290 63305456 [C 2: 1457010 46624320 java.util.concurrent.ConcurrentHashMap$Segment 3: 1502500 36060000 java.util.concurrent.locks.ReentrantLock$NonfairSync 4: 87785 29987632 [I 5: 1457010 23638928 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry; 6: 285668 15240784 [Ljava.lang.Object; 7: 87239 10680160 <constMethodKlass> 8: 399482 9587568 java.lang.String 9: 16533 7466624 [B 10: 91065 7285072 [Ljava.util.concurrent.ConcurrentHashMap$Segment; 11: 87239 6983288 <methodKlass> 12: 125750 5868720 <symbolKlass> 13: 45409 5449080 java.net.SocksSocketImpl 14: 63574 4936176 [S 15: 45294 4710576 sun.nio.ch.SocketChannelImpl
jmap –permstat pid 查看Class Loader。
jmap –dump:file=filename,format=b pid dump内存到文件。
可以使用MAT工具分析java dump文件。
发表评论
-
预估GC频率的方法
2012-10-15 16:10 1115我们在进行GC调优的 ... -
GC调优及awk脚本分析GC日志
2012-03-15 16:22 0原有GC参数 JAVA_OPTS=&qu ... -
了解CMS(Concurrent Mark-Sweep)垃圾回收器
2012-03-15 15:18 01.总体介绍: CMS(Concur ... -
JVM参数调优,无停滞实践
2012-03-15 11:38 0JVM参数调优是个很头痛的问题,设置的不好,JVM不断执行Fu ... -
JVM系列五:JVM监测&工具[整理中]
2012-03-15 10:04 0前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产 ... -
JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
2012-03-15 10:03 0java application项目(非web项目) ... -
JVM系列二:GC策略&内存申请、对象衰老
2012-03-15 10:02 0JVM里的GC(Garbage Collection)的算法 ... -
JVM系列一:JVM内存组成及分配
2012-03-15 10:01 0java内存组成介绍:堆(Heap)和非堆(Non-hea ... -
HotSpot VM GC 的种类
2012-03-15 10:00 0collector种类 ... -
JVM系列三:JVM参数设置、分析
2012-03-15 09:40 0不管是YGC还是Full GC,GC过程中都会对导致程序运行中 ... -
JVM GC日志和内存DUMP参数配置
2012-03-15 08:03 0在JVM出现内存溢出或泄 ... -
一次Java垃圾收集调优实战
2012-03-14 10:46 01 资料 JDK5.0垃圾收集优化之--Don't P ... -
CMS gc实践总结
2012-03-14 10:44 0首先感谢阿宝 同学的帮助,我才对这个gc算法的调整有了一定的 ... -
工具分析GC日志
2012-03-14 10:37 0工具分析GC日志 ... -
JVM监控工具介绍
2012-03-13 15:45 0转: jstack -- 如果java程序崩溃生 ... -
多线程性能调优
2012-02-25 08:40 01、性能调优的步骤1.1、 ... -
JVM gc参数设置与分析
2011-04-02 14:49 1606来自:http://hi.baidu.com/i1see1yo ... -
java jvm GC 参数设置
2011-04-02 14:27 1309来自:http://yefeng.iteye.com/blog ...
相关推荐
《GC2053:格科微电子的1/2.9" FHD CMOS图像传感器解析》 在现代科技的快速发展中,图像传感器在各个领域都扮演着至关重要的角色,尤其是在摄像头应用中。GC2053是格科微电子(GalaxyCore)推出的一款1/2.9英寸的高...
标题中的"SENSOR_GC1054.rar_1054-sensor_SENSOR_GC1054_gc1054"暗示了我们正在处理一种名为GC1054的传感器,这可能是一款专用于图像处理的传感器。在IT行业中,这类传感器通常被应用于摄像头设备、机器视觉系统或...
标题 "GC6153_SERIAL_GC6153" 指向的是一款基于MTK(MediaTek)平台的驱动程序,专为控制SPI接口的GC6153芯片而设计。这款驱动程序的主要功能是确保GC6153芯片在系统中能够正确地被初始化、配置和操作,从而实现其...
GC2145 CMOS图像传感器数据手册 GC2145是一种1/5英寸的UXGA CMOS图像传感器,用于图像采集和处理应用场景。下面是GC2145数据手册的详细解读: Sensor Overview GC2145是一种高性能的CMOS图像传感器,具有高分辨率...
GC4023 CMOS图像传感器数据手册 GC4023是一款高性能的CMOS图像传感器,用于capturing高质量图像。该传感器具有1/2.7英寸的感光面积、4Mega像素的高分辨率和低噪音的特点。该传感器的datasheet提供了详细的技术规格...
《MT6261_GC6153_Driver_V0:格科微GC6153模组驱动解析》 在电子技术领域,驱动程序扮演着至关重要的角色,它是硬件设备与操作系统之间的桥梁,使得软件能够有效控制硬件设备。本文将深入探讨"MT6261_GC6153_Driver...
GC02M1 datasheet GC02M1是一款CMOS图像传感器,具有高分辨率、低噪声和高灵敏度等特点。下面是根据GC02M1 datasheet的内容生成的相关知识点: 1. 传感器概述 GC02M1是一款1/5英寸的CMOS图像传感器,具有200万像素...
《MT65xx_GC032A_Driver_20170614_GC032A_GC032A_Drive》是一款专为MT65xx平台设计的GC032A图像传感器驱动程序,它在原有的厂家驱动基础上进行了一些定制化的改进,以优化性能和效果。此驱动程序的更新日期为2017年6...
在全志A64平台点亮GC2145 2017/5/25 14:39 小技巧,直接在全志A64的SDK中搜索ov5640(默认是几乎通的),全部替换为gc2145即可。 1、 R:\wyb\gc2145_bpi_a64_android\android\device\softwinner\bpi-m64-lcd\...
《GC5025.tar.gz:RK3368平台上的GC5025摄像头驱动详解》 在嵌入式系统开发中,摄像头驱动扮演着至关重要的角色,它连接硬件设备与软件应用,使得图像捕获和处理成为可能。本文将深入探讨针对RK3368平台的GC5025...
【标题】"gc2355_mipi_raw_摄像头gc2355驱动_" 指的是一个针对特定型号摄像头GC2355的驱动程序,该驱动是为MT6737处理器平台设计的。在嵌入式系统中,摄像头驱动是连接硬件设备(即摄像头)与操作系统内核之间的重要...
"GC-powerstation 9.1.2" 是一个专门针对垃圾收集(Garbage Collection, GC)优化的工具或平台的版本号。在IT领域,尤其是Java编程语言中,垃圾收集是一个核心概念,它负责自动管理内存,释放不再使用的对象,以防止...
### GC0329 CMOS 图像传感器技术详解 #### 一、传感器概述 ##### 1.1 一般描述 GC0329是一款由国内最大的CMOS图像传感器制造商格科微电子研发的新一代VGA图像传感器。该传感器拥有640×480像素的分辨率,采用1/9...
GC2035是一款高品质的200万像素CMOS图像传感器,主要应用于移动电话摄像头和数码相机产品。该传感器具备1/5英寸的标准光学格式、1616Vx1232H的像素阵列,并且内部集成了10位模数转换器(ADC)以及图像信号处理器。...
【gc0310前置摄像头驱动】是针对高通(Qualcomm)平台,特别是msm8909芯片组的一款摄像头驱动程序。该驱动是为了使gc0310这款图像传感器在搭载高通骁龙处理器的设备上正常工作,确保前置摄像头功能的稳定性和效率。...
《VisualGC插件:JVM监控的得力助手》 在Java开发中,对JVM(Java虚拟机)的监控是至关重要的,它可以帮助我们理解应用程序的运行状况,优化性能,预防内存泄漏等问题。VisualVM是一款强大的JVM诊断工具,它提供了...
【标题】"gc0310 mipi 驱动"是针对Android 4.4系统,基于MediaTek MT6572平台的一款摄像头驱动程序。MIP(Mobile Industry Processor Interface)I是移动设备中广泛使用的高速接口,主要用于连接摄像头传感器和其他...
GC2023是一款高性价比的2M像素CMOS图像传感器,主要用于手机相机和数码相机产品。GC2023采用了1928H x 1088V像素阵列,集成了片上10位模数转换器(ADC)和图像信号处理器。其高性能与低功耗功能的全面集成,使其成为...
全志R16的android4.4.2平台点亮gc2145(evb30) 版本:V1.1 1、配置ov2640在android层配置的分辨率为vga(预览/拍照/录像) 注意:系统自带的快拍APP就在这里查找分辨率参数发送到camera的HAL层。 这里得分辨率...