- 浏览: 3063145 次
- 性别:
- 来自: 海外
-
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
当使用 -server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintHeapAtGC 参数启动HotSpot来运行Java程序时,可以看到类似下面这种GC log:
好多名字好多数字。可是它们分别是什么意思呢?在源码里找找答案吧~
如果设置PrintHeapAtGC参数,则HotSpot在GC前后都会将GC堆的概要状况输出到log中。
在HotSpot源码中搜索“PrintHeapAtGC”,可以找到许多地方。其中形如“if (PrintHeapAtGC)”的就是该参数起作用的地方。这里挑genCollectedHeap为例来看看:
hotspot/src/share/vm/memory/genCollectedHeap.cpp
类似的,另外几种GC堆负责执行回收的方法也会在回收前后分别调用Universe::print_heap_before_gc()与Universe::print_heap_after_gc():
那么这两个输出堆信息的函数是如何实现的呢?
hotspot/src/share/vm/memory/universe.hpp
hotspot/src/share/vm/memory/universe.cpp
OK,可以看到大体骨架了。在invocations=后的数字表示的是总的GC次数,full后的数字则是其中full GC的次数。接下来就交给各个不同算法实现的GC堆来输出自身的信息了。
留意到本例中启动JVM时用了-XX:+UseParNewGC -XX:+UseConcMarkSweepGC这两个参数。这指定了在年轻代使用parallel new收集器,在年老代使用concurrent-mark-sweep收集器。这种组合所使用的堆就是前面提到的GenCollectedHeap,本例中输出堆信息调用heap()->print_on(st)调用的就是GenCollectedHeap::print_on(),代码上面也贴出来了。其中每一代都被组织为一个Generation类的对象:
hotspot/src/share/vm/memory/generation.hpp
(题外话:注意上面的注意提到这个分代式GC堆的框架下所允许的组合有哪些。
可以留意到ParallelGC与G1GC不在其中,难道它们不是分代式的?其实是,虽然它们也是分代式GC的实现(G1逻辑上是分代式的),但并没有使用HotSpot原先的框架,而是另外开了接口。这点在OpenJDK的一篇文档上有所描述:
)
好吧,扯回来。看看Generation::print_on()是如何实现的:
hotspot/src/share/vm/memory/generation.cpp
可以看到每行上输出的是:
其中总容量与已使用空间都是以KB为单位的。
呃,“数字1”“数字2”“数字3”是怎么回事?可以看到它们是_virtual_space的属性,其声明为:
“reserved area”是指申请了但还没实际提交的空间,“commited area”是指申请了并已提交的空间。“reserved”与“commited”是在分阶段向操作系统申请空间时会涉及的概念,在Windows上的话,可以参考MSDN上VirtualAlloc()的文档。
至此可知本文开头GC log的后几行格式为:
左方括号与右圆括号就是标准的区间记法,表示一个左闭右开的区间。
至于eden、from、to这三行的格式也是大同小异,就懒得深究了……
根据分析,可以很清楚的看到开头的GC log所表示的堆的年轻代:年老代:永久代的空间分配分别是16MB:80MB:64MB,比例是1:5:4。用图画出来,可以看到它们在虚拟内存中是被紧挨着分配的:
以上数据和代码基于JDK 1.6.0 update 18,在32位Windows XP SP3上。
博主能不能明确的解释一下是怎么从这段log得到文末的图的呢?
通过eden加上两个survivor得到:(13184+1600+1600)/1024=16M,这个可以理解。可是,log中的par new generation total 14784K又是什么含义呢?这个和16M是对不上的。
文末的图中的年老带(80M)、永久带(64M)的容量又是怎么从log中推算出来的呢?看log中的49152K和16384K都是对不上这些数字的。
Sure。这些分代的大小都是用后面的地址来确定的。
Young Generation的范围是[0x03ad0000, 0x04ad0000),就是16M;相应的,Old Generation的范围是[0x04ad0000, 0x09ad0000),就是80M,PermGen依此类推。
这个total后面的是“current capacity”,简单来说就是当前已经commit了的内存的大小。current capacity是可以在min capacity与max capacity之间浮动的,max就是分代的整体大小,也就是上面说的16M啊80M啊那些。
博主能不能明确的解释一下是怎么从这段log得到文末的图的呢?
通过eden加上两个survivor得到:(13184+1600+1600)/1024=16M,这个可以理解。可是,log中的par new generation total 14784K又是什么含义呢?这个和16M是对不上的。
文末的图中的年老带(80M)、永久带(64M)的容量又是怎么从log中推算出来的呢?看log中的49152K和16384K都是对不上这些数字的。
如果是用Visual Studio 2010在Windows上构建OpenJDK 7的话本身应该没啥问题吧?
我现在公司的开发机上没装VS2010,自己的本上只装了Ubuntu…抱歉暂时没环境
{Heap before GC invocations=0 (full 0): par new generation total 14784K, used 13175K [0x03ad0000, 0x04ad0000, 0x04ad0000) eden space 13184K, 99% used [0x03ad0000, 0x047adcf8, 0x047b0000) from space 1600K, 0% used [0x047b0000, 0x047b0000, 0x04940000) to space 1600K, 0% used [0x04940000, 0x04940000, 0x04ad0000) concurrent mark-sweep generation total 49152K, used 0K [0x04ad0000, 0x07ad0000, 0x09ad0000) concurrent-mark-sweep perm gen total 16384K, used 2068K [0x09ad0000, 0x0aad0000, 0x0dad0000)
好多名字好多数字。可是它们分别是什么意思呢?在源码里找找答案吧~
如果设置PrintHeapAtGC参数,则HotSpot在GC前后都会将GC堆的概要状况输出到log中。
在HotSpot源码中搜索“PrintHeapAtGC”,可以找到许多地方。其中形如“if (PrintHeapAtGC)”的就是该参数起作用的地方。这里挑genCollectedHeap为例来看看:
hotspot/src/share/vm/memory/genCollectedHeap.cpp
void GenCollectedHeap::do_collection(bool full, bool clear_all_soft_refs, size_t size, bool is_tlab, int max_level) { bool prepared_for_verification = false; ResourceMark rm; DEBUG_ONLY(Thread* my_thread = Thread::current();) assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint"); assert(my_thread->is_VM_thread() || my_thread->is_ConcurrentGC_thread(), "incorrect thread type capability"); assert(Heap_lock->is_locked(), "the requesting thread should have the Heap_lock"); guarantee(!is_gc_active(), "collection is not reentrant"); assert(max_level < n_gens(), "sanity check"); // ... if (PrintHeapAtGC) { Universe::print_heap_before_gc(); if (Verbose) { gclog_or_tty->print_cr("GC Cause: %s", GCCause::to_string(gc_cause())); } } // perform GC... if (PrintHeapAtGC) { Universe::print_heap_after_gc(); } // ... } // ... void GenCollectedHeap::print_on(outputStream* st) const { for (int i = 0; i < _n_gens; i++) { _gens[i]->print_on(st); } perm_gen()->print_on(st); }
类似的,另外几种GC堆负责执行回收的方法也会在回收前后分别调用Universe::print_heap_before_gc()与Universe::print_heap_after_gc():
PSMarkSweep::invoke_no_policy() PSScavenge::invoke_no_policy() PSParallelCompact::pre_compact() PSScavenge::invoke_no_policy() G1CollectedHeap::do_collection() G1CollectedHeap::do_collection_pause_at_safepoint()
那么这两个输出堆信息的函数是如何实现的呢?
hotspot/src/share/vm/memory/universe.hpp
static void print_heap_before_gc() { print_heap_before_gc(gclog_or_tty); } static void print_heap_after_gc() { print_heap_after_gc(gclog_or_tty); }
hotspot/src/share/vm/memory/universe.cpp
void Universe::print_heap_before_gc(outputStream* st) { st->print_cr("{Heap before GC invocations=%u (full %u):", heap()->total_collections(), heap()->total_full_collections()); heap()->print_on(st); } void Universe::print_heap_after_gc(outputStream* st) { st->print_cr("Heap after GC invocations=%u (full %u):", heap()->total_collections(), heap()->total_full_collections()); heap()->print_on(st); st->print_cr("}"); }
OK,可以看到大体骨架了。在invocations=后的数字表示的是总的GC次数,full后的数字则是其中full GC的次数。接下来就交给各个不同算法实现的GC堆来输出自身的信息了。
留意到本例中启动JVM时用了-XX:+UseParNewGC -XX:+UseConcMarkSweepGC这两个参数。这指定了在年轻代使用parallel new收集器,在年老代使用concurrent-mark-sweep收集器。这种组合所使用的堆就是前面提到的GenCollectedHeap,本例中输出堆信息调用heap()->print_on(st)调用的就是GenCollectedHeap::print_on(),代码上面也贴出来了。其中每一代都被组织为一个Generation类的对象:
hotspot/src/share/vm/memory/generation.hpp
// A Generation models a heap area for similarly-aged objects. // It will contain one ore more spaces holding the actual objects. // // The Generation class hierarchy: // // Generation - abstract base class // - DefNewGeneration - allocation area (copy collected) // - ParNewGeneration - a DefNewGeneration that is collected by // several threads // - CardGeneration - abstract class adding offset array behavior // - OneContigSpaceCardGeneration - abstract class holding a single // contiguous space with card marking // - TenuredGeneration - tenured (old object) space (markSweepCompact) // - CompactingPermGenGen - reflective object area (klasses, methods, symbols, ...) // - ConcurrentMarkSweepGeneration - Mostly Concurrent Mark Sweep Generation // (Detlefs-Printezis refinement of // Boehm-Demers-Schenker) // // The system configurations currently allowed are: // // DefNewGeneration + TenuredGeneration + PermGeneration // DefNewGeneration + ConcurrentMarkSweepGeneration + ConcurrentMarkSweepPermGen // // ParNewGeneration + TenuredGeneration + PermGeneration // ParNewGeneration + ConcurrentMarkSweepGeneration + ConcurrentMarkSweepPermGen // // ... class Generation: public CHeapObj { // ... // Memory area reserved for generation VirtualSpace _virtual_space; // ... public: // The set of possible generation kinds. enum Name { ASParNew, ASConcurrentMarkSweep, DefNew, ParNew, MarkSweepCompact, ConcurrentMarkSweep, Other }; // ... // Space enquiries (results in bytes) virtual size_t capacity() const = 0; // The maximum number of object bytes the // generation can currently hold. virtual size_t used() const = 0; // The number of used bytes in the gen. virtual size_t free() const = 0; // The number of free bytes in the gen. // ... };
(题外话:注意上面的注意提到这个分代式GC堆的框架下所允许的组合有哪些。
可以留意到ParallelGC与G1GC不在其中,难道它们不是分代式的?其实是,虽然它们也是分代式GC的实现(G1逻辑上是分代式的),但并没有使用HotSpot原先的框架,而是另外开了接口。这点在OpenJDK的一篇文档上有所描述:
引用
Collector Styles
There are two styles in which we've built collectors. At first we had a framework into which we could plug generations, each of which would have its own collector. The framework is general enough for us to have built several collectors on it, and does support a limited amount of mix-and-matching of “framework” generations. The framework has some inefficiencies due to the generality at allows. We've worked around some of the inefficiencies. When we built the high-throughput collector we decided not to use the framework, but instead designed an interface that a collector would support, with the high-throughput collector as an instance of that interface. That means that the “interface” collectors can't be mixed and matched, which implies some duplication of code. But it has the advantage that one can work on an “interface” collector without worrying about breaking any of the other collectors.
There are two styles in which we've built collectors. At first we had a framework into which we could plug generations, each of which would have its own collector. The framework is general enough for us to have built several collectors on it, and does support a limited amount of mix-and-matching of “framework” generations. The framework has some inefficiencies due to the generality at allows. We've worked around some of the inefficiencies. When we built the high-throughput collector we decided not to use the framework, but instead designed an interface that a collector would support, with the high-throughput collector as an instance of that interface. That means that the “interface” collectors can't be mixed and matched, which implies some duplication of code. But it has the advantage that one can work on an “interface” collector without worrying about breaking any of the other collectors.
)
好吧,扯回来。看看Generation::print_on()是如何实现的:
hotspot/src/share/vm/memory/generation.cpp
void Generation::print_on(outputStream* st) const { st->print(" %-20s", name()); st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K", capacity()/K, used()/K); st->print_cr(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")", _virtual_space.low_boundary(), _virtual_space.high(), _virtual_space.high_boundary()); }
可以看到每行上输出的是:
GC堆的名字 total 总容量 used 已使用空间 [数字1,数字2,数字3)
其中总容量与已使用空间都是以KB为单位的。
呃,“数字1”“数字2”“数字3”是怎么回事?可以看到它们是_virtual_space的属性,其声明为:
// VirtualSpace is data structure for committing a previously reserved address range in smaller chunks. class VirtualSpace VALUE_OBJ_CLASS_SPEC { // ... private: // Reserved area char* _low_boundary; char* _high_boundary; // Committed area char* _low; char* _high; // ... public: // Committed area char* low() const { return _low; } char* high() const { return _high; } // Reserved area char* low_boundary() const { return _low_boundary; } char* high_boundary() const { return _high_boundary; } // ... };
“reserved area”是指申请了但还没实际提交的空间,“commited area”是指申请了并已提交的空间。“reserved”与“commited”是在分阶段向操作系统申请空间时会涉及的概念,在Windows上的话,可以参考MSDN上VirtualAlloc()的文档。
至此可知本文开头GC log的后几行格式为:
GC堆的名字 total 总容量 used 已分配空间 [申请的虚拟空间下限,已分配的虚拟空间上限,申请的虚拟空间上限)
左方括号与右圆括号就是标准的区间记法,表示一个左闭右开的区间。
至于eden、from、to这三行的格式也是大同小异,就懒得深究了……
根据分析,可以很清楚的看到开头的GC log所表示的堆的年轻代:年老代:永久代的空间分配分别是16MB:80MB:64MB,比例是1:5:4。用图画出来,可以看到它们在虚拟内存中是被紧挨着分配的:

以上数据和代码基于JDK 1.6.0 update 18,在32位Windows XP SP3上。
评论
4 楼
RednaxelaFX
2011-11-04
hittyt 写道
{Heap before GC invocations=0 (full 0): par new generation total 14784K, used 13175K [0x03ad0000, 0x04ad0000, 0x04ad0000) eden space 13184K, 99% used [0x03ad0000, 0x047adcf8, 0x047b0000) from space 1600K, 0% used [0x047b0000, 0x047b0000, 0x04940000) to space 1600K, 0% used [0x04940000, 0x04940000, 0x04ad0000) concurrent mark-sweep generation total 49152K, used 0K [0x04ad0000, 0x07ad0000, 0x09ad0000) concurrent-mark-sweep perm gen total 16384K, used 2068K [0x09ad0000, 0x0aad0000, 0x0dad0000)
博主能不能明确的解释一下是怎么从这段log得到文末的图的呢?
通过eden加上两个survivor得到:(13184+1600+1600)/1024=16M,这个可以理解。可是,log中的par new generation total 14784K又是什么含义呢?这个和16M是对不上的。
文末的图中的年老带(80M)、永久带(64M)的容量又是怎么从log中推算出来的呢?看log中的49152K和16384K都是对不上这些数字的。
Sure。这些分代的大小都是用后面的地址来确定的。
Young Generation的范围是[0x03ad0000, 0x04ad0000),就是16M;相应的,Old Generation的范围是[0x04ad0000, 0x09ad0000),就是80M,PermGen依此类推。
par new generation total 14784K
这个total后面的是“current capacity”,简单来说就是当前已经commit了的内存的大小。current capacity是可以在min capacity与max capacity之间浮动的,max就是分代的整体大小,也就是上面说的16M啊80M啊那些。
3 楼
hittyt
2011-11-04
{Heap before GC invocations=0 (full 0): par new generation total 14784K, used 13175K [0x03ad0000, 0x04ad0000, 0x04ad0000) eden space 13184K, 99% used [0x03ad0000, 0x047adcf8, 0x047b0000) from space 1600K, 0% used [0x047b0000, 0x047b0000, 0x04940000) to space 1600K, 0% used [0x04940000, 0x04940000, 0x04ad0000) concurrent mark-sweep generation total 49152K, used 0K [0x04ad0000, 0x07ad0000, 0x09ad0000) concurrent-mark-sweep perm gen total 16384K, used 2068K [0x09ad0000, 0x0aad0000, 0x0dad0000)
博主能不能明确的解释一下是怎么从这段log得到文末的图的呢?
通过eden加上两个survivor得到:(13184+1600+1600)/1024=16M,这个可以理解。可是,log中的par new generation total 14784K又是什么含义呢?这个和16M是对不上的。
文末的图中的年老带(80M)、永久带(64M)的容量又是怎么从log中推算出来的呢?看log中的49152K和16384K都是对不上这些数字的。
2 楼
RednaxelaFX
2011-02-13
IcyFenix 写道
撒迦能否写一篇在Windows平台下使用Visual C++来建立HotSpot跟踪调试环境的文章呢?
如果是用Visual Studio 2010在Windows上构建OpenJDK 7的话本身应该没啥问题吧?
我现在公司的开发机上没装VS2010,自己的本上只装了Ubuntu…抱歉暂时没环境

1 楼
IcyFenix
2011-02-13
鼓掌。
OpenJDK网站上有在Linux上建立NetBeans的HotSpot开发环境的文章。
撒迦能否写一篇在Windows平台下使用Visual C++来建立HotSpot跟踪调试环境的文章呢?

OpenJDK网站上有在Linux上建立NetBeans的HotSpot开发环境的文章。
撒迦能否写一篇在Windows平台下使用Visual C++来建立HotSpot跟踪调试环境的文章呢?
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16347以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10497先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22448(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21913之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48461刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
一、项目简介 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.5及以上 后端:spring+springboot+mybatis+maven+mysql 前端: vue , css,js , elementui 三、系统功能 1、系统角色主要包括:管理员、用户 2、系统功能 前台功能包括: 用户登录 车位展示 系统推荐车位 立即预约 公告展示 个人中心 车位预定 违规 余额充值 后台功能: 首页,个人中心,修改密码,个人信息 用户管理 管理员管理 车辆管理 车位管理 车位预定管理,统计报表 公告管理 违规管理 公告类型管理 车位类型管理 车辆类型管理 违规类型管理 轮播图管理 详见 https://flypeppa.blog.csdn.net/article/details/146122666
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql 部署环境:maven 数据库工具:navica 更多毕业设计https://cv2022.blog.csdn.net/article/details/124463185
内容为Python程序设计的思维导图,适用于新手小白进行浏览,理清思路
2024-Stable Diffusion全套资料(软件+关键词+模型).rar
mmexport1741417035005.png
COMSOL三维锂离子电池全耦合电化学热应力模型:模拟充放电过程中的多物理场耦合效应及电芯内应力应变情况,COMSOL锂离子电池热应力全耦合模型,comsol三维锂离子电池电化学热应力全耦合模型锂离子电池耦合COMSOL固体力学模块和固体传热模块,模型仿真模拟电池在充放电过程中由于锂插层,热膨胀以及外部约束所导致的电极的应力应变情况结果有电芯中集流体,电极,隔膜的应力应变以及压力情况等,电化学-力单向耦合和双向耦合 ,关键词: 1. COMSOL三维锂离子电池模型; 2. 电化学热应力全耦合模型; 3. 锂离子电池; 4. 固体力学模块; 5. 固体传热模块; 6. 应力应变情况; 7. 电芯中集流体; 8. 电极; 9. 隔膜; 10. 电化学-力单向/双向耦合。,COMSOL锂离子电池全耦合热应力仿真模型
基于传递矩阵法的一维层状声子晶体振动传输特性及其优化设计与应用,声子晶体传递矩阵法解析及应用,Matlab 一维层状声子晶体振动传输特性 传递矩阵法在声子晶体的设计和应用中具有重要作用。 通过调整声子晶体的材料、周期和晶格常数等参数,可以设计出具有特定带隙结构的声子晶体,用于滤波、减震、降噪等应用。 例如,通过调整声子晶体的周期数和晶格常数,可以改变带隙的位置和宽度,从而实现特定的频率范围内的噪声控制。 此外,传递矩阵法还可以用于分析和优化声子晶体的透射谱,为声学器件的设计提供理论依据。 ,Matlab; 一维层状声子晶体; 振动传输特性; 传递矩阵法; 材料调整; 周期和晶格常数; 带隙结构; 滤波; 减震; 降噪; 透射谱分析; 声学器件设计,Matlab模拟声子晶体振动传输特性及优化设计研究
头部姿态估计(HeadPose Estimation)-Android源码
永磁同步电机FOC、MPC与高频注入Simulink模型及基于MBD的代码生成工具,适用于Ti f28335与dspace/ccs平台开发,含电机控制开发文档,永磁同步电机控制技术:FOC、MPC与高频注入Simulink模型开发及应用指南,提供永磁同步电机FOC,MPC,高频注入simulink模型。 提供基于模型开发(MBD)代码生成模型,可结合Ti f28335进行电机模型快速开发,可适用dspace平台或者ccs平台。 提供电机控制开发编码器,转子位置定向,pid调试相关文档。 ,永磁同步电机; FOC控制; MPC控制; 高频注入; Simulink模型; 模型开发(MBD); Ti f28335; 电机模型开发; dspace平台; ccs平台; 编码器; 转子位置定向; pid调试。,永磁同步电机MPC-FOC控制与代码生成模型
light of warehouse.zip
内容概要:文章深入讨论了工业乙醇发酵的基本原理及工艺流程,特别是在温度和气体排放(如CO2及其他有害气体)影响下的发酵效果分析。文章介绍了乙醇发酵的重要环节,如糖分解、代谢路径、代谢调控以及各阶段的操作流程,重点展示了如何通过Matlab建模和仿真实验来探索这两个关键环境因素对发酵过程的具体影响。通过动态模型仿真分析,得出合适的温度范围以及适时排除CO2能显著提升发酵产乙醇的效果与效率,从而提出了基于仿真的优化发酵生产工艺的新方法。 适用人群:从事生物工程相关领域研究的科学家、工程师及相关专业师生。 使用场景及目标:适用于实验室环境、学术交流会议及实际生产指导中,以提升研究人员对该领域内复杂现象的理解能力和技术水平为目标。 其他说明:附录中有详细的数学公式表达和程序代码可供下载执行,便于有兴趣的研究团队重复实验或者继续扩展研究工作。
本资源包专为解决 Tomcat 启动时提示「CATALINA_HOME 环境变量未正确配置」问题而整理,包含以下内容: 1. **Apache Tomcat 9.0.69 官方安装包**:已验证兼容性,解压即用。 2. **环境变量配置指南**: - Windows 系统下 `CATALINA_HOME` 和 `JAVA_HOME` 的详细配置步骤。 - 常见错误排查方法(如路径含空格、未生效问题)。 3. **辅助工具脚本**:一键检测环境变量是否生效的批处理文件。 4. **解决方案文档**:图文并茂的 PDF 文档,涵盖从报错分析到成功启动的全流程。 适用场景: - Tomcat 9.x 版本环境配置 - Java Web 开发环境搭建 - 运维部署调试 注意事项: - 资源包路径需为纯英文,避免特殊字符。 - 建议使用 JDK 8 或更高版本。
这是一款仿照京东商城的Java Web项目源码,完美复现了360buy的用户界面和购物流程,非常适合Java初学者和开发者进行学习与实践。通过这份源码,你将深入了解电商平台的架构设计和实现方法。欢迎大家下载体验,提升自己的编程能力!
系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
这是一款专为大学生打造的求职就业网JavaWeb毕业设计源码,功能齐全,界面友好。它提供简历投递、职位搜索、在线交流等多种实用功能,能够帮助你顺利进入职场。无论你是想提升技术水平还是寻找灵感,这个源码都是不可多得的资源。快来下载,让你的求职之路更加顺畅吧!
useTable(1).ts
实验一: 1、进行CCS6.1软件的安装,仿真器的设置,程序的编译和调试; 2、熟悉CCS软件中的C语言编程; 3、使用按键控制LED跑马灯的开始与停止、闪烁频率; 4、调试Convolution、FFT、FIR、FFT-FIR实验,编制IIR算法并调试,并在CCS软件上给出实验结果。 实验二: 1、利用定时器周期中断或下溢中断和比较器比较值的修改来实现占空比可调的PWM波形; 2、改变PWM占空比控制LED灯的亮暗,按键实现10级LED灯亮暗调整; 3、模拟数字转换,转换过程中LED指示,并在变量窗口显示转换结果; 4、数字模拟转换,产生一个正弦波,转换过程中LED指示,转换完成后在CCS调试窗口显示波形。 实验三: 1、SCI异步串行通信实验; 2、SPI及IIC同步串行通信实验; 3、CAN现场总线串行通信实验; 4、传输过程中LED指示。 实验四: 1、电机转速控制实验。
LINUX系统管理与配置.docx
chromedriver-mac-x64-136.0.7055.0.zip
地级城市驻地,dbf 地级城市驻地,prj 地级城市驻地.sbn 9 地级城市驻地.sbx 地级城市驻地.shp 地级城市驻地.shx 9 国界线.dbf 国界线.prj 国界线.sbne 国界线.sbx 国界线.shp 国界线.shx )经纬网.dbf ]经纬网.prj 经纬网.sbn 经纬网.sbx 经纬网.shp 经纬网.shx 全国县级统计数据.dbf 全国县级统计数据,prj 全国县级统计数据.sbr 全国县级统计数据.sbx 全国县级统计数据.shp 全国县级统计数据.shx )省会城市.dbf 省会城市,prj 省会城市.sbn 省会城市.sbx 省会城市.shp 省会城市.shx 省级行政区.dbf 省级行政区,pn 省级行政区.sbn 省级行政区,sbx 9 省级行政区.shp 9 6 省级行政区,shx 县城驻地.dbf 县城驻地,prj 擷垃岑械鰣媛城驻地.sbr 藶勇瑁鴎隐城驻地.sbx 县蓿玨蒴城驻地.shp 苽6城驻地,shx 线状省界.dbf 线状省界,prj 1线状首界,sbn 线状省界.sbx 线状首界.shp 线状省界,shx 线状县界,dbf □]