This may be wasted memory if we cache plans for queries that never get called again.
This may be a good use case for SQL Server 2008's Optimize for Ad Hoc Workloads or for Forced Parameterization
Example:
SP_CONFIGURE 'optimize for ad hoc workloads',1
RECONFIGURE
GO

Reads are averaging longer than 100ms for at least one database on this drive
Writes are averaging longer than 20ms for at least one database on this drive
Tips:
- Find tables without clustered indexes
- Find unused indexes
- Find missing indexes
- Find triggers

"SQLCLR is enabled". Verify if you are really using .Net Assemblies in databases.

lightweight pooling

0

User mode scheduler uses lightweight pooling

max degree of parallelism

0

maximum degree of parallelism

max server memory (MB)

4096

Maximum size of server memory (MB)

optimize for ad hoc workloads

0

When this option is set, plan cache size is further reduced for single-use adhoc OLTP workload.

"optimize for ad hoc workloads" is off. This option may improves the cache efficiency for execution plans for workloads that contains a lot of single use batch ad hoc. When set to 1, at the first execution the database engine stores a small compiled plan stub in the plan cache, instead of the full compiled plan.